如何使用 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 设置默认查询超时?
如何将继承策略与 JPA 注释和 Hibernate 混合使用?