1

我收到这样的错误

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

我搜索并发现可以使用CascadeType.MERGE或重构大量代码来修复它,以防止相同的数据库对象成为会话中的两个实例。

我无法重构它。

CascadeType.MERGE工作,但这意味着我必须编写很多代码来解决删除问题,因为它是.ALL以前的,对吧?

我得到它的工作推杆

@Transactional(propagation = Propagation.REQUIRES_NEW)

上面一个方法,一个用 注释的类@Service,那个查询数据库,它是抛出我提到的异常的那个。

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

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

4

2 回答 2

2

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

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

我会重新考虑应用Propagation.REQUIRES_NEW.

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

于 2017-06-21T12:27:19.937 回答
1

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

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

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

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

您必须了解实体生命周期才能正确理解此处发生的情况。

于 2017-06-21T12:42:05.383 回答