2013-05-04 77 views
1

我在JPA中遇到了兩個具有一對多關係的實體的奇怪問題。我在EclipseLink 2.3.2上使用Glassfish 3.1.2.2。這是第一個實體:JPA OneToMany渴望獲取不起作用

@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 

} 

我有一個使用注入EntityManager運行SampleQueryGroup.findAll命名查詢無狀態會話bean。我還有一個CDI託管bean,它調用SSB方法,並通過SampleQueryGroup.getSampleQueries()迭代該方法返回的每個SampleQueryGroup。我沒有粘貼代碼,因爲它非常簡單,並且對於任何Java EE應用程序來說都是標準的。

問題是渴望獲取不起作用,getSampleQueries()返回一個空列表。但是,當我將獲取類型更改回FetchType.LAZY時,一切正常,我得到正確填充的列表。我不明白爲什麼會發生這種情況。它與內部緩存機制有什麼關係?

回答

1

我的猜測是,當你添加一個新的SampleQuery時,你並沒有將它添加到SampleQueryGroup sampleQueries中,所以當你訪問它時,它不是它們的。當它是懶惰的時候,你不會觸發它,直到你插入了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

+0

謝謝詹姆斯,我認爲這是問題。在堅持實體的SSB方法中,是否有必要明確地設置/添加每個實體到另一個實體? – 2013-05-07 21:13:26