1

このマッピングを持つ User エンティティがあります。

@OneToMany(mappedBy = "supervisor", fetch = LAZY, cascade = [CascadeType.REFRESH])
List<Group> supervisedGroups = new ArrayList<Group>()

およびこのマッピングを持つ Group エンティティ:

@ManyToOne(fetch = LAZY, cascade = [CascadeType.REFRESH])
@JoinColumn(name = "supervisor")
User supervisor

リポジトリのおかげでユーザーをフェッチします

User user = userRepository.findById(id)

findById メソッドはトランザクションによってラップされ (メソッドはトランザクション マネージャーのアドバイスによってインターセプトされます)、JPA の作業単位はリクエストが続く限り続きます (ビューごとのセッション)。

ユーザーを取得したら、

user.getSupervisedGroups()

これは空のリストを返します。コレクション型は Eclipselinks の IndirectList であり、size() メソッドを呼び出してもそれ以上のことはしません。

しかし、私が実行すると

entitymanager.refresh(user)
user.getSupervisedGroups()

次に、リストに2つのアイテムがあります...なぜですか?EclipseLink がコレクションでの LAZY フェッチをまったくサポートしていないということですか?

4

3 に答える 3

2

私の推測では、共有 L2 キャッシュ内のそのオブジェクトが破損していると思われます。

このオブジェクトを挿入したときに、正しいオブジェクトをコレクションに追加しましたか? 私の推測では、双方向の OneToMany/ManyToOne 関係があり、One 側を挿入して Many 側に追加しない場合です。オブジェクトの関係を正しく維持する必要があります。

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_sideを参照して ください

于 2012-08-29T12:58:00.610 に答える
0

フェッチ属性fetch = LAZYを両方のエンティティからfetch=FetchType.LAZYに変更します。

  @OneToMany(mappedBy = "supervisor", fetch=FetchType.LAZY, cascade = CascadeType.REFRESH)
于 2012-08-29T05:23:11.877 に答える