【问题标题】:What collateral effect Propagation.REQUIRES_NEW will cause to my appPropagation.REQUIRES_NEW 会对我的应用造成什么附带影响
【发布时间】:2017-06-21 11:57:39
【问题描述】:

我遇到了这样的错误

具有相同标识符值的不同对象已与会话关联:

我搜索了一下,发现可以用CascadeType.MERGE修复或者重构很多代码来防止同一个数据库对象在会话中变成两个实例。

我无法重构它。

CascadeType.MERGE 有效,但这意味着我必须编写大量代码来解决删除问题,因为之前是 .ALL,对吧?

我搞定了

@Transactional(propagation = Propagation.REQUIRES_NEW)

在带有@Service 注释的类的方法之上,即查询数据库,它是引发我提到的异常的那个。

我需要帮助来了解这种新的带注释的方法是否会像现在这样给我带来任何未来的头痛。

它是从我正在修复的操作旁边的一些 cron 作业中调用的。

【问题讨论】:

    标签: java spring hibernate spring-mvc hibernate-session


    【解决方案1】:

    实际上,您通过使用@Transactional(propagation = Propagation.REQUIRES_NEW) 注释方法来为方法调用创建一个单独的事务

    这意味着在方法抛出异常的情况下,所有数据库更改(保存等)都会应用并且不会回滚。这可能会严重损坏业务逻辑,并可能导致数据库中的数据不一致。

    我会重新考虑申请Propagation.REQUIRES_NEW

    Merge 在这种情况下听起来更合适。

    【讨论】:

      【解决方案2】:

      恕我直言,您列出的所有解决方案都不可接受。

      将部分处理推迟到新事务将破坏工作单元的原子性(全部或全部),更改级联类型将意味着您手动处理之前自动级联的所有操作。

      正确的方法是了解为什么 hibernate 会遇到 2 个具有相同标识符的不同对象实例,最常见的原因是因为您手动持久(保存)具有固定标识符的分离/瞬态对象,而该对象已经存在于会话中(具有相同标识符的托管对象已在会话中)。

      您可以尝试手动重新附加(合并/更新/saveOrUpdate)导致问题的分离对象实例。

      您必须了解entity lifecycle 才能正确理解此处发生的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 2012-10-04
        • 2019-04-23
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        相关资源
        最近更新 更多