Hibernate合并 [英] Hibernate merge
本文介绍了Hibernate合并的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在测试hibernate并将此查询提供给
$ p $
transaction = session.beginTransaction();
city = new City(A);
city =(City)session.merge(city);
city.setName(B);
transaction.commit();
我在命令行中获取这些查询:
Hibernate:插入CITY(名称)值(?)
Hibernate:更新CITY set name =? CITY_ID =?
我正在使用merge not save,所以为什么hibernate正在更新我的对象,它不应该更新。它是正确的吗?什么是错误?
解决方案
我会尝试用更具体的例子来解释。假设你有如下的场景:
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User userA =(User)session.get(User.class,1101);
transaction.commit();
session.close();
//由于会话关闭,userA被分离。
session = sessionFactory.openSession();
transaction = session.beginTransaction();
User userB =(User)session.get(User.class,1101);
//现在在这里,userB代表与userA相同的持久行。
//当发生重新连接userA的尝试时,抛出异常
session.update(userA);
transaction.commit();
session.close();
尝试重新附加Detached对象userA时发生异常。
线程main中的异常org.hibernate.NonUniqueObjectException:具有相同标识符值的
不同对象已经与
关联session:
这是因为Hibernate强制在内存中只存在一个Persistent对象的实例。
为了解决上述问题,使用merge(),如下所示:
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User userA =(User)session.get(User.class,1101);
transaction.commit();
session.close();
// userA现在在会话关闭时分离。
session = sessionFactory.openSession();
transaction = session.beginTransaction();
User userB =(User)session.get(User.class,1101);
User userC =(User)session.merge(userA);
if(userB == userC){
System.out.println(Reattched user is equal);
}
transaction.commit();
session.close();
I am testing hibernate and giving this query to
transaction = session.beginTransaction();
city = new City("A");
city = (City)session.merge(city);
city.setName("B");
transaction.commit();
And I am getting those queries in the command line:
Hibernate: insert into CITY (name) values (?)
Hibernate: update CITY set name=? where CITY_ID=?
I am using merge not save, so why hibernate is updating my object, It should not update. am it right? What is the mistake?
解决方案
I will try to explain using a more concrete example. Suppose you have a scenario like below :
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User userA = (User)session.get(User.class, 1101);
transaction.commit();
session.close();
// Since session is closed, userA is detached.
session = sessionFactory.openSession();
transaction = session.beginTransaction();
User userB = (User)session.get(User.class, 1101);
//Now here, userB represents the same persistent row as userA.
//When an attempt to reattach userA occurs, an exception is thrown
session.update(userA);
transaction.commit();
session.close();
Exception when an attempt to reattach a Detached object, userA is made.
Exception in thread "main" org.hibernate.NonUniqueObjectException: a
different object with the same identifier value was already associated
with the session:
This is because Hibernate is enforcing that only a single instance of a Persistent object exists in memory.
To get around the above problem, merge() is used, as shown below :
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User userA = (User)session.get(User.class, 1101);
transaction.commit();
session.close();
//userA is now detached as session is closed.
session = sessionFactory.openSession();
transaction = session.beginTransaction();
User userB = (User)session.get(User.class, 1101);
User userC = (User)session.merge(userA);
if (userB == userC) {
System.out.println("Reattched user is equal");
}
transaction.commit();
session.close();
这篇关于Hibernate合并的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文