Hibernate合并 [英] Hibernate merge

查看:121
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆