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

时间:2012-08-10 10:39:39

标签: java mysql hibernate jsp jdbc

我有一个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

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

我很确定我的hibernate方法存在错误,因为我对hibernate很新。当我使用JDBC和Mysql查询时,相同的代码工作正常。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

所以hibernate认为你在没有数据改变的情况下再次保存同一个对象,所以自然它没有做任何事情。

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

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