JPA OneToMany急切获取不起作用

时间:2013-05-04 15:00:03

标签: java database java-ee jpa eclipselink

我有两个在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时,一切正常,我正确填充列表。我不明白为什么会这样。它与内部缓存机制有什么关系吗?

1 个答案:

答案 0 :(得分:1)

我的猜测是,当你添加一个新的SampleQuery时,你没有将它添加到SampleQueryGroup sampleQueries,所以当你访问它时,它不是它们的。当它是LAZY时,在插入SampleQuery之前不会触发它,所以它就在那里。

你需要保持双方的关系。 (你也可以禁用缓存,或者刷新对象,但你的代码仍然会被破坏)。

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side