gpt4 book ai didi

java - 抛出异常后使用当前 session

转载 作者:太空宇宙 更新时间:2023-11-04 14:34:20 25 4
gpt4 key购买 nike

根据Hibernate documentation Hibernate抛出异常后使用Session是不安全的。

If the Session throws an exception, including any SQLException, immediately rollback the database transaction, call Session.close() and discard the Session instance. Certain methods of Session will not leave the session in a consistent state. No exception thrown by Hibernate can be treated as recoverable. Ensure that the Session will be closed by calling close() in a finally block.

在我的代码中,我正在执行批量插入。我正在使用 sessionFactory.getCurrentSession() 方法来获取 session 。我的代码是这样的。

try {
//some code here....
....
Table1Entity table1Entity = .......
List<Table2Entity> table2Entities = .......
Session currentSession = sessionFactory.getCurrentSession();
for (int i = 0; i < table2Entities; i++) {
.............
currentSession.save(table2Entities.get(i));
if(i % batchSize == 0 || i + 1 == table2Entities) {
currentSession.flush();
currentSession.clear();
}
}
} catch (Exception e) {
currentSession.getTransaction().rollback();
//currentSession.close(); //According to documentation Session should be closed here
table1Entity.setError(true);
currentSession.save(table1Entity);//According to documentation Session should not be used here
.......
}

正如文档所说,在抛出异常后不应使用 session 。我的问题是,由于我使用的是 currentSession,如何将 table1Entity 保存在 catch block 中?我应该使用 openSession() 方法还是其他方式打开一个新 session ?


编辑:更清楚地说,我要问的是在现有的 currentSession关闭后是否可以检索新的 currentSession

最佳答案

它是一个 try..catch block 。您如何确定对 table1Entity 进行的任何处理都绝对不会抛出 Hibernate 异常?如果在处理 table1Entity 时确实出现异常,则尝试将其保存在当前 session 中可能会产生更大的问题。

我的建议是,将对表的处理分成单独的 try..catch block ,并在每个 block 中单独调用 save。抛出异常后,尝试在 catch block 中保存同一 session 中的事务是不安全的,并且假设 table1Entity 中没有问题有时可能是违反直觉的。

关于java - 抛出异常后使用当前 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25779874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com