我正在尝试学习如何创建Java Enterprise应用程序(当前使用EclipseLink),在那里我有一个User
实体,该实体与@ManyToMany
实体具有Card
关系,但是当从数据库中加载用户时,卡片属性不会像我期望的那样自动填充。
这是我的用户实体:
@Entity
@Table(name = "USR")
public class User extends Person implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "CPF", unique = true, nullable = false)
private String cpf;
@Column(name = "USERNAME", length = 20, nullable = false, unique = true)
private String username;
@Column(name = "BDAY")
@Temporal(TemporalType.DATE)
private Date bDay;
@Column(name = "EMAIL", length = 100, nullable = false, unique = true)
private String email;
@ManyToMany
private List<Card> cards;
public User() {
super();
}
}
这是我的银行卡实体:
@Entity
public class Card implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String number;
@Column(name = "EXP_DATE")
@Temporal(TemporalType.DATE)
private Date expDate;
@Column(name = "VALIDATOR")
private int validator;
@Transient
private String endsWith;
public Card() {
}
}
因此,当实例化我的servlet
时,我像这样userBean.setUser(userFactoryEJB.find(2));
从数据库中加载用户,并且工作正常,我可以访问用户的电子邮件,bday,用户名等。但是,当我尝试获取用户卡,并收到以下消息{IndirectList: not instantiated}
。在有人问之前,我确实尝试过在User构造函数上初始化列表,并出现相同的消息。
我希望用户从DB加载,并且所有卡都已加载在card属性中。
答案 0 :(得分:1)
集合值关系的默认访存类型是lazy。提交事务后,所有已加载的实体都将变为分离状态,并且您将无法访问惰性加载实体。
我认为您是在另一笔交易中检索用户的。
请检查您的TransactionAttribute批注。
一些可能的解决方案是:
1)您是否在CDI bean或另一个会话bean中使用userFactoryEJB?您必须从另一个会话bean调用userFactoryEJB或在CDI bean上使用@Transactional。
2)将获取类型更改为“渴望”。
@ManyToMany(fetch = FetchType.EAGER)
private List<Card> cards;
3)定义另一个find方法并在返回用户之前调用getcrads()方法