我有两个在JPA中具有一对多关系的实体的奇怪问题。我正在使用带有EclipseLink 2.3.2的Glassfish 3.1.2.2。这是第一个实体:
@NamedQueries({
@NamedQuery(name="SampleQueryGroup.findAll", query="SELECT g FROM SampleQueryGroup g")
})
@Entity
public class SampleQueryGroup implements Serializable {
// Simple properties, including id (primary key)
@OneToMany(
mappedBy = "group",
fetch = FetchType.EAGER,
cascade = {CascadeType.REMOVE, CascadeType.MERGE}
)
private List<SampleQuery> sampleQueries;
// Gettes/setters, hashcode/equals
}
这是第二个:
@Entity
public class SampleQuery implements Serializable {
// Simple properties, including id (primary key)
@ManyToOne(cascade = {CascadeType.PERSIST})
private SampleQueryGroup group;
// Gettes/setters, hashcode/equals
}
我有一个无状态会话bean,它使用注入的EntityManager
来运行SampleQueryGroup.findAll
命名查询。我还有一个CDI托管bean,它调用SSB方法,并为方法返回的每个SampleQueryGroup.getSampleQueries()
迭代SampleQueryGroup
。我没有粘贴代码,因为它非常简单,并且在任何Java EE应用程序中都是标准的。
问题是急切的提取不起作用,getSampleQueries()
返回一个空列表。但是,当我将获取类型更改回FetchType.LAZY时,一切正常,我正确填充列表。我不明白为什么会这样。它与内部缓存机制有什么关系吗?
答案 0 :(得分:1)
我的猜测是,当你添加一个新的SampleQuery时,你没有将它添加到SampleQueryGroup sampleQueries,所以当你访问它时,它不是它们的。当它是LAZY时,在插入SampleQuery之前不会触发它,所以它就在那里。
你需要保持双方的关系。 (你也可以禁用缓存,或者刷新对象,但你的代码仍然会被破坏)。