我有 A类类型的记录列表,让我们说List<A> list=new ArrayList<A>();
。
现在我正尝试使用session.save();
将A的每条记录保存到数据库中。
如果我的第二个记录失败,那么我的其余记录都会失败。在这种情况下,我尝试使用session.evict(obj)
从会话中删除第二条记录。但我仍然得到同样的行为。
以下是代码:
for(A a:list){
try{
session.save(a);
}
catch{
log.exception("Primary key");
session.evict(a);
}
}
答案 0 :(得分:0)
致电saveOrUpdate(a)
而非session.save(a);
修改强>
start transaction
session.saveOrUpdate(a);
a.getId() // this should have id.
return a;
end transaction
答案 1 :(得分:0)
根据您的代码,我在代码中没有看到session.flush(); session.clear();
这种方法。所以更新你的代码如下
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
int i = 0;
for(A a:list){
try{
session.save(a);
if (i % 20 == 0 ) {
//20, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
i++;
} catch {
log.exception("Primary key");
session.evict(a);
}
}
tx.commit();
session.close();
希望这能解决您的问题
答案 2 :(得分:0)
你为什么要从会话中驱逐它? 你可以忽略它 然后它将在迭代时保存成功的对象,并将错误保留为一个 另一种方法是,一旦在catch块中逐出对象,就可以刷新会话 希望这可能有效