Java 异常后休眠会话对象
我有类型为A类的记录列表,比如说Java 异常后休眠会话对象,java,spring,hibernate,jakarta-ee,persistence,Java,Spring,Hibernate,Jakarta Ee,Persistence,我有类型为A类的记录列表,比如说list list list=new ArrayList() 现在,我正试图使用session.save()将a的每条记录保存到数据库中。 如果我的第二条记录失败,那么我的其余记录也会失败。在这种情况下,我尝试使用session.execute(obj)从会话中删除第二条记录。但我还是有同样的行为。 代码如下: for(A a:list){ try{ session.save(a); } catch{ log.except
list list list=new ArrayList()代码>
现在,我正试图使用session.save()将a的每条记录保存到数据库中代码>。
如果我的第二条记录失败,那么我的其余记录也会失败。在这种情况下,我尝试使用session.execute(obj)
从会话中删除第二条记录。但我还是有同样的行为。
代码如下:
for(A a:list){
try{
session.save(a);
}
catch{
log.exception("Primary key");
session.evict(a);
}
}
调用saveOrUpdate(a)
而不是session.save(a)代码>
编辑
start transaction
session.saveOrUpdate(a);
a.getId() // this should have id.
return a;
end transaction
根据您的代码,我没有看到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();
希望这能解决您的问题您为什么要将其从会话中删除?
您可以忽略它。
然后,它将在迭代时保存成功的对象,并保留错误。
另一种方法是,一旦对象在catch块中被逐出,就可以刷新会话。
希望这能起作用发生异常后,您不能继续使用会话。另请看,我认为您必须修改逻辑,因为在Hibernate中抛出异常之后,行为不可预测。异常发生后,我仍然可以使用会话对象。我想返回生成的标识符。通过使用saveOrUpdate,我找不到生成的标识符,我需要返回标识符。您可以返回应具有生成标识符的同一对象。saveOrUpdate不返回任何内容ryt?请建议我是否仍然面临同样的问题。