我正在测试休眠并将此查询提供给
transaction = session.beginTransaction(); city = new City("A"); city = (City)session.merge(city); city.setName("B"); transaction.commit();
我在命令行中得到这些查询:
Hibernate: insert into CITY (name) values (?) Hibernate: update CITY set name=? where CITY_ID=?
我使用的是“合并不保存”,所以为什么休眠要更新我的对象,所以不应该更新。对吗 怎么了
我将尝试使用一个更具体的示例进行解释。假设您有以下情况:
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();
尝试重新附加分离的对象时发生异常,userA。
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.
为了解决上述问题,使用了merge(),如下所示:
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();