gpt4 book ai didi

java - Hibernate 刷新和 JTAUnexpectedRollbackException

转载 作者:搜寻专家 更新时间:2023-10-30 23:24:47 25 4
gpt4 key购买 nike

我正在使用 Spring 和 Hibernate。和 Atomikos 进行交易。我使用基于注释的事务。我有一个 DAO 对象,在我调用 entityManager.persist() 的方法之一中保存该对象。现在,无论何时在更新期间出现 ORA 错误,例如违反约束或其中一列的长度超过数据库中定义的 wat,我都会得到 JTAUnexpectedRollbackException 而不是 Spring 抛出的 GenericJDBCException。我尝试尝试坚持不懈地捕获它,但我在那里没有任何异常(exception)。似乎 Hibernate 在刷新期间执行了实际的更新语句,这发生在事务提交期间,因此我猜是 UnexpectedRollbackException。

我怎样才能解决这个问题并获得 GenericJDBCException 而不是 UnexpectedRollbackException?

最佳答案

首先,免责声明:我不使用 Atomikos。我不认为它与所讨论的错误有任何关系,但不能确定。

不久前,我在 Spring/Hibernate 应用程序中遇到了一个非常相似的问题。 Hibernate 实际上只在刷新期间将 session 更新传播到数据库。问题是冲洗可能会在不同的时间发生,具体取决于冲洗模式。它默认为 AUTO,这意味着如果 session 包含可能影响查询结果的更新,则刷新可能会在查询执行之前发生。您在这里有多种选择:

A) 您可以在调用 entityManager.persist() 后立即手动调用 entityManager.flush() 并在此时捕获异常(如果有)。这样做的缺点(可能适用于您的情况,也可能不适用)是刷新会破坏批量更新,因此如果您在单个事务中对同一实体类型进行多次插入/更新,您可能会(可能)遇到性能显着下降的情况.

B) 您可以将刷新模式设置为 COMMIT,这将延迟刷新直到提交事务(或直到手动调用 flush())。然后,您可以在该点捕获异常,或者,如果由于 Atomikos 而证明这是不可能的,您可以在提交之前手动调用 flush()(例如,在您的服务调用结束时)。缺点是这比选项 A 更难(在我的情况下更难,对于 Atomikos 可能更难 - 我不知道)并且您的查询可能会返回陈旧数据。

关于java - Hibernate 刷新和 JTAUnexpectedRollbackException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1168911/

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