1

我对 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 应用程序都是标准的。

问题是 Eager fetch 不起作用并getSampleQueries()返回一个空列表。但是,当我将 fetch 类型更改回 FetchType.LAZY 时,一切正常,并且我得到了正确填充的列表。我不明白为什么会这样。它与内部缓存机制有什么关系吗?

4

1 回答 1

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

于 2013-05-06T17:57:46.653 回答