如何使用 Hibernate session.save() 插入/保存对象而不更新旧记录

Posted

技术标签:

【中文标题】如何使用 Hibernate session.save() 插入/保存对象而不更新旧记录【英文标题】:How to insert/save an object using Hibernate session.save() without updating the old record 【发布时间】:2012-08-07 15:43:24 【问题描述】:

我有一个search.jsp 页面,我可以在其中搜索和检索数据库中的记录。我必须复制这条记录并进行修改并保存两条记录。

例如:

 method1()
  Response response=new Response();
  //To perform DB search
  response=delegate.requestSearch(//some request criteria);
  Types obj1=(Types) response.getBaseEntity();
  Types obj2=obj1;
  obj2.setPromaryKeyObject(//some unique value);
 

在我的 DAO 中,保存方法:

session.save(obj1);
session.save(obj2);
transaction.commit(); // transaction

当调试点提交事务时,我只得到一个更新查询。但我希望有两个插入查询。

但这很好用。这是一次尝试,但这不是我想做的。

Types tempObj1 = new Types();    
tempObj1.setValue1(obj1.getValue1();
 // all values of the object should be set
session.save(tempObj1);
Types tempObj1 = new Types();    
tempObj2.setValue1(obj2.getValue1();
 // all values of the object should be set
session.save(tempObj2);
transaction.commit(); // transaction

在这种情况下,我会触发两个插入查询。

我很确定错误出在我的休眠方法中,因为我对休眠非常陌生。当我使用 JDBC 和 mysql 查询时,同样的代码可以正常工作。

【问题讨论】:

【参考方案1】:

这都是关于 id 的。如果数据库中存在具有给定 ID 的对象,则更新它。如果没有设置 id 则根据生成策略生成并插入新记录。有时(取决于配置)您必须明确设置 id。

由于您使用 MySQL,我猜您使用 autoincrement 列作为 id 和 IDENTITY 生成策略。您可能需要做的是将 id 保留为更新记录,并将 id 设置为 null 以作为您要插入的新记录。

【讨论】:

>类型 obj2=obj1; obj2.setPromaryKeyObject(//一些唯一值);这就是我在这行代码中所做的。在将 ID 发送到保存方法之前,我正在更改 ID。 obj2 和 obj1 是对同一个对象的两个引用 同意。但是属性的值正在改变。 知道了:)。这是一个诚实的错误。谢谢。【参考方案2】:

这是由于obj2 == obj1。试试obj2 = obj1.clone();

【讨论】:

【参考方案3】:

Hibernate 在内部跟踪您拥有save()'d 的对象。您并没有真正使用此代码创建新实例

  Types obj1=(Types) response.getBaseEntity();
  Types obj2=obj1;

所以 hibernate 认为你再次保存了同一个对象而没有更改数据,所以它自然什么也没做。

有两种方法可以解决这个问题:

将数据复制到新实例并再次调用 save。这个有点 就像您拥有的第二个代码片段一样。 使用不将参数与会话关联的merge() 方法,这样每次调用merge(something) 时都会生成一个插入。 (这假设您已经清除了 something 的 id 并首先将其与会话解除关联。)

【讨论】:

@bill.cn :我不知道如何解除关联。起作用的一件事是关闭会话,提交事务并再次打开会话。但它绝对不能接受。请告诉我正确的方法。我每次都必须保存大约 400 个对象。所以这个 'session.saveOrUpdate(obj)' 在 while 循环中。我卡住了e。请帮忙。

以上是关于如何使用 Hibernate session.save() 插入/保存对象而不更新旧记录的主要内容,如果未能解决你的问题,请参考以下文章

初识Hibernate 以及如何使用Maven创建Hibernate项目

如何使用 JPA 和 Hibernate 设置默认查询超时?

如何使用 Hibernate 选择列?

如何将继承策略与 JPA 注释和 Hibernate 混合使用?

如何使用 Spring 清除所有 Hibernate 缓存(ehcache)?

Hibernate:如何使用HQL设置NULL查询参数值?