1

JPA で 1 対多の関係を持つ 2 つのエンティティに奇妙な問題があります。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

}

そして、これは2番目のものです:

@Entity
public class SampleQuery implements Serializable {

    // Simple properties, including id (primary key)

    @ManyToOne(cascade = {CascadeType.PERSIST})
    private SampleQueryGroup group;

    // Gettes/setters, hashcode/equals

}

名前付きクエリEntityManagerを実行するために注入されたステートレス セッション Bean があります。また、SSB メソッドを呼び出し、メソッドによって返されるたびにSampleQueryGroup.findAll反復処理を行う CDI マネージド Bean もあります。コードは非常に単純で、何らかの Java EE アプリケーションの標準であるため、貼り付けませんでした。SampleQueryGroup.getSampleQueries()SampleQueryGroup

問題は、熱心なフェッチが機能せずgetSampleQueries()、空のリストを返すことです。ただし、フェッチ タイプを 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 に答える