Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常后休眠会话对象_Java_Spring_Hibernate_Jakarta Ee_Persistence - Fatal编程技术网

Java 异常后休眠会话对象

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

我有类型为A类的记录列表,比如说
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?请建议我是否仍然面临同样的问题。