java - hibernate 合并

标签 java hibernate

我正在测试 hibernate 并将此查询提供给

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=?

我使用的是合并而不是保存,所以为什么 hibernate 更新我的对象,它不应该更新。对吗?什么错误?

最佳答案

我会尝试用一个更具体的例子来解释。假设您有如下场景:

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();

当用户 A 尝试重新附加分离对象时出现异常。

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();

关于java - hibernate 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846017/

相关文章:

java - Spring hibernate jdbc 批量大小

java - Spring3 依赖注入(inject)不适用于 mule

hibernate - 在这种情况下覆盖 Hibernate 延迟加载的最佳方法

mysql - 外键 BIGSERIAL NULL Postgres

java - Java 中 hadoop map/reduce 程序中奇怪的格式问题

java - driver.findElement(By.className) 是否定位具有多个类名的类?

Java:如何将一个方法重构为一个类,然后在其他类中使用它的参数?

java - 无法连接到 Spotify Kafka 容器,基本连接问题

java - 适用于 JPA beans 的 JSF 可编辑数据表,一应俱全

java - 单表策略如何防止Hibernate生成的表和Entities一样多?