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 的原始问题:持久性上下文缓存 id 和 SQL 查询?)。

Hibernates 奇怪的可变对象缓存(恕我直言,我一直认为在缓存中存储可变对象是愚蠢的想法)在这里讨论:http: //apmblog.compuware.com/2009/02/16/understanding-caching-in-hibernate-一部分的会话缓存/

合并应替换s2s1重新附加s1到上下文/会话。刷新或关闭会话后,它将保存到数据库中。如果您已保存s2然后合并s1,我认为但不确定您是否会在保存时获得机会锁定异常,特别是如果您跨线程共享会话。

确定的最好方法是编写单元测试。

于 2013-03-11T18:37:24.090 回答
0

这将使用名称 Manik 进行更新。我们将使用合并来更新值而不考虑会话状态。

于 2013-03-11T18:34:39.740 回答
0

由于这个原因,这将更新到 Manik:Use merge() if you want to merge your modifications at any time without consideration of the state of the session.来自hibernate 文档

于 2013-03-11T18:36:15.407 回答