2

Merge は Name を Manik または Ankit に更新しますか?

Student s1 = null;
s1 = (Student)session1.get(Student.class, new Integer(101));
session1.close();
s1.setName("Manik");
Session session2 = factory.openSession();
Student s2 = null;
Object o1 = session2.get(Student.class, new Integer(101));
s2 = (Student)o1;
s2.setName("Ankit");
Transaction tx=session2.beginTransaction();
session2.merge(s1);
4

3 に答える 3

1

名前を「Manik」に更新する必要があります(参考までに、OP の元の Q: Persistence context cache the id and SQL query?)。

Hibernates の奇妙な可変オブジェクト キャッシュ (可変オブジェクトをキャッシュに格納する愚かなアイデアだと私がいつも感じていること) については、こちらで説明しています。 part-one-the-session-cache/

マージは、コンテキスト/セッションへのs2s1アタッチに置き換える必要があります。s1セッションをフラッシュまたは閉じると、データベースに保存されます。保存s2してからマージしs1た場合、特にスレッド間でセッションを共有する場合、保存時に Opportunistic Lock 例外が発生する可能性があると思います。

確実に知る最善の方法は、単体テストを作成することです。

于 2013-03-11T18:37:24.090 に答える
0

これは Manik という名前で更新されます。マージを使用して、セッション状態を考慮せずに値を更新します。

于 2013-03-11T18:34:39.740 に答える
0

これは次の理由により Manik に更新されます: hibernate のドキュメントUse merge() if you want to merge your modifications at any time without consideration of the state of the session.から。

于 2013-03-11T18:36:15.407 に答える