我有一个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查询时,相同的代码工作正常。
答案 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认为你在没有数据改变的情况下再次保存同一个对象,所以自然它没有做任何事情。
有两种方法可以解决这个问题:
merge()
方法,以便每次调用merge(something)
时都会生成插入。 (这假设你已经清除了something
的id,并首先将其与会话解除关联。)