在持久化对象列表时出现异常后休眠提交的问题

Issue with Hibernate commit after exception while persisting a list of objects

提问人:Eduardo 提问时间:11/16/2023 更新时间:11/16/2023 访问量:23

问:

在对象列表持久化期间发生异常后,我尝试使用 Hibernate 提交时遇到了一个问题。我的代码利用 Hibernate 将对象保存在数据库中,并且我希望确保在错误发生之前成功处理的对象保存在数据库中,即使在发生异常之后也是如此。

目前,我的方法如下所示:

private void persist(List<T> entities, Boolean commitInError, boolean isSaveOrUpdate) {
        try {
            transaction = session.beginTransaction();
            
            for (T entity : entities) {
                if (isSaveOrUpdate) {
                    session.merge(entity);
                } else {
                    session.remove(entity);
                }
            }
            
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                if (commitInError) {
                    try {
                        transaction.commit();
                    } catch (Exception e2) {
                        throw e2;
                    }
                } else {
                    transaction.rollback();
                }
            }
            throw e;
        } finally {
            close();
        }
    }

我想知道是否有人在对象列表持久化期间出现异常后尝试使用 Hibernate 提交时遇到类似的问题。是否有任何推荐的解决方案或方法来处理这种情况?

提前感谢您的帮助!

我使用hibernate 6.3.1.Final

Java Hibernate 事务

评论

0赞 M. Deinum 11/16/2023
建议的方法,不要。发生异常时,会话的状态无效/不确定。如果要在两者之间提交,请使用多个事务或使用保存点。
0赞 Eduardo 11/17/2023
你能举个例子吗?
0赞 M. Deinum 11/17/2023
你的代码看起来也有缺陷,因为你正在重用一个可能在类级别的字段,这感觉是错误的,特别是如果它位于单例对象中。启动一个事务,每个 x 个元素执行 flush、clear 和 commit 并启动一个新事务。这样,您只会丢失您处理的最后 x 条记录(最大值)。或者,如果您的数据库支持它,则可以使用保存点并对单个事务执行中间提交(但这取决于您的数据库)。transaction

答: 暂无答案