1

我有一个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 查询时,同样的代码可以正常工作。

4

3 回答 3

1

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

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

于 2012-08-10T10:45:36.570 回答
0

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

于 2012-08-10T10:51:32.637 回答
0

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

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

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

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

  • 将数据复制到新实例并再次调用 save。这有点像您拥有的第二个代码片段。
  • 使用merge()不将参数与会话关联的方法,以便每次调用merge(something)时都会生成一个插入。(这假设您首先清除了 idsomething并将其与会话解除关联。)
于 2012-08-10T10:53:29.170 回答