[jboss-user] [EJB 3.0] - New Core bug? FetchType.Eager does not work on collection w
JLuv
do-not-reply at jboss.com
Mon Sep 25 21:16:33 EDT 2006
I'm trying to eagerly load a Set of an entity that has an EmbeddedId. When I call EntityManager.find, it does not load the Set. When I change the embeddedId to be a regular Id, all is well. Am I doing something wrong, or should I log a new bug?
I'm using Entity Manager 3.2.0 CR2, with Hibernate Core 3.2.0 CR4.
Card:
| @Entity
| public class Card implements Serializable {
| @Id
| private String id;
|
| @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "card")
| private Set<CardField> fields;
|
| public Card(String id) {
| this();
| this.id = id;
|
| }
|
| Card() {
| fields = new HashSet<CardField>();
| }
|
| public String getId() {
| return id;
| }
|
| public void setId(String id) {
| this.id = id;
| }
|
| public void addField(Card card, Key key) {
| fields.add(new CardField(card, key));
| }
|
| @Override
| public int hashCode() {
| final int PRIME = 31;
| int result = 1;
| result = PRIME * result + ((id == null) ? 0 : id.hashCode());
| return result;
| }
|
| @Override
| public boolean equals(Object obj) {
| System.out.println("Equals invoked");
| System.exit(0);
| if (this == obj)
| return true;
| if (obj == null)
| return false;
| if (getClass() != obj.getClass())
| return false;
| final Card other = (Card) obj;
| if (id == null) {
| if (other.id != null)
| return false;
| } else if (!id.equals(other.id))
| return false;
| return true;
| }
| }
|
CardField:
| @Entity
| public class CardField implements Serializable {
|
| private static final long serialVersionUID = 1L;
|
| private PrimaryKey primaryKey;
|
| private String id;
|
| CardField(Card card, Key key) {
| this.primaryKey = new PrimaryKey(card, key);
| }
|
| CardField() {
| }
|
| @Override
| public int hashCode() {
| final int PRIME = 31;
| int result = 1;
| result = PRIME * result + ((primaryKey == null) ? 0 : primaryKey.hashCode());
| return result;
| }
|
| @Override
| public boolean equals(Object obj) {
| System.out.println("Equals invoked");
| System.exit(0);
| if (this == obj)
| return true;
| if (obj == null)
| return false;
| if (getClass() != obj.getClass())
| return false;
| final CardField other = (CardField) obj;
| if (primaryKey == null) {
| if (other.primaryKey != null)
| return false;
| } else if (!primaryKey.equals(other.primaryKey))
| return false;
| return true;
| }
|
| @EmbeddedId
| public PrimaryKey getPrimaryKey() {
| return primaryKey;
| }
|
| public void setPrimaryKey(PrimaryKey primaryKey) {
| this.primaryKey = primaryKey;
| }
|
| // BEGIN Workaround until issue is resolved.
| // http://opensource.atlassian.com/projects/hibernate/browse/EJB-225
| @ManyToOne
| @JoinColumn(insertable=false, updatable=false)
| public Card getCard() {
| return primaryKey.getCard();
| }
|
| public void setCard(Card card) {
| primaryKey.setCard(card);
| }
|
| @ManyToOne
| @JoinColumn(insertable=false, updatable=false)
| public Key getKey() {
| return primaryKey.getKey();
| }
|
| public void setKey(Key key) {
| primaryKey.setKey(key);
| }
| // END Workaround
| }
|
Changing CardField to use regular Id makes the Set in Card load eagerly:
| @Entity
| public class CardField implements Serializable {
|
| private static final long serialVersionUID = 1L;
|
| private PrimaryKey primaryKey;
|
| private String id;
|
| private Card card;
|
| private Key key;
|
| CardField(Card card, Key key) {
| this.primaryKey = new PrimaryKey(card, key);
| this.card = card;
| this.key = key;
| this.id = card.getId() + key.getId();
| }
|
| CardField() {
| }
|
| @Override
| public int hashCode() {
| final int PRIME = 31;
| int result = 1;
| result = PRIME * result + ((primaryKey == null) ? 0 : primaryKey.hashCode());
| return result;
| }
|
| @Override
| public boolean equals(Object obj) {
| System.out.println("Equals invoked");
| System.exit(0);
| if (this == obj)
| return true;
| if (obj == null)
| return false;
| if (getClass() != obj.getClass())
| return false;
| final CardField other = (CardField) obj;
| if (primaryKey == null) {
| if (other.primaryKey != null)
| return false;
| } else if (!primaryKey.equals(other.primaryKey))
| return false;
| return true;
| }
|
| //@EmbeddedId
| @Transient
| public PrimaryKey getPrimaryKey() {
| return primaryKey;
| }
|
| public void setPrimaryKey(PrimaryKey primaryKey) {
| this.primaryKey = primaryKey;
| }
|
| @Id
| public String getId() {
| return id;
| }
|
| public void setId(String id) {
| this.id = id;
| }
|
| @ManyToOne(optional = false)
| @JoinColumn(name="cardId")
| public Card getCard() {
| return card;
| }
|
| public void setCard(Card card) {
| this.card = card;
| }
|
| @ManyToOne(optional = false)
| @JoinColumn(name="keyId")
| public Key getKey() {
| return key;
| }
|
| public void setKey(Key key) {
| this.key = key;
| }
| }
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3974076#3974076
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3974076
More information about the jboss-user
mailing list