2

これが私のクラスです

class Teacher {
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
Set<Students> getStudents()
}

問題は、

セッション1

ステップ1:教師ID = 1を取得し、同じセッションでsession.intitializeCollection(teacher.children)を呼び出して生徒を初期化します

ステップ2:新しい学生を追加します(id = 1)

ステップ3:教師インスタンスをマージして、追加された生徒を挿入します

セッション2:

ステップ1:セッション1のステップ2の前にTeacher id = 1を取得します。intializeCollection(teacher.children)を使用して子を初期化します

ステップ2:マージを実行して、セッション1で行われた変更を取得します(ステップ3の後)

//このステップで、Hibernate IDがTeacherを更新し、Student1を削除します

ステップ3:別の生徒を追加し(id = 2)、教師をマージして生徒を保存します(id = 2)

ステップ2でマージ2が実行されると、セッション1で行われた変更でコレクションが更新される、つまり、セッション1からセッション2の子コレクションに新しいオブジェクトが追加されると想定していました。

誰かがこれが起こっている理由と、セッション2で生徒のコレクションがテーブルへの変更で更新されるように、つまり子オブジェクトがテーブルに追加されるようにオブジェクトを処理する方法を説明できますか?

また、ステップ1の後、オブジェクトはWebベースのビューレイヤーに渡され、ステップ2で変更され、ステップ3で再アタッチされるため、教師オブジェクトはデタッチされたインスタンスになります。

4

1 に答える 1

0

The merge() method merges modifications made to the detached instance into the corresponding managed instance, if any, without consideration of the state of the persistence context. In other words, the merged objects state overrides the persistent entity state in the persistence context, if one is already present.

getStudentsは怠惰であるため、セッション2でコレクションが実体化されることはありません。mergeを呼び出すと、空のコレクションが表示され、それが必要なものであると見なされるため、永続オブジェクトから生徒が削除されます。セッション2では、新しい生徒をマージまたは追加する前に、必ずgetStudentsを呼び出す必要があります。

于 2012-11-21T19:17:11.207 に答える