Java 传播新内容将对我的应用程序产生什么副作用
我犯了这样的错误 具有相同标识符值的不同对象已与会话关联: 我已经搜索并发现它可以通过Java 传播新内容将对我的应用程序产生什么副作用,java,spring,hibernate,spring-mvc,hibernate-session,Java,Spring,Hibernate,Spring Mvc,Hibernate Session,我犯了这样的错误 具有相同标识符值的不同对象已与会话关联: 我已经搜索并发现它可以通过CascadeType.MERGE或重构大量代码来修复,以防止同一个数据库对象成为会话中的两个实例 我不能重构它 CascadeType.MERGE有效,但这意味着我必须编写大量代码来解决删除问题,因为以前是。所有的,对吗 我让它起作用了 @Transactional(propagation = Propagation.REQUIRES_NEW) 上面是一个用@Service注释的类的方法,该查询数据库就是引
CascadeType.MERGE
或重构大量代码来修复,以防止同一个数据库对象成为会话中的两个实例
我不能重构它
CascadeType.MERGE
有效,但这意味着我必须编写大量代码来解决删除问题,因为以前是。所有的,对吗
我让它起作用了
@Transactional(propagation = Propagation.REQUIRES_NEW)
上面是一个用@Service
注释的类的方法,该查询数据库就是引发我提到的异常的数据库
我需要帮助了解这个新的带注释的方法是否会像现在这样给我带来未来的头痛。
它是从我正在修复的操作旁边的一些cron作业中调用的。事实上,您通过使用@Transactional(传播=传播。需要\u NEW)
这意味着在方法抛出异常的情况下,将应用所有数据库更改(保存等),并且不会回滚。这可能会严重破坏业务逻辑,并且可能是数据库中不一致数据的来源
我会重新考虑应用传播。需要新的
在这种情况下,“合并”听起来更合适。您列出的任何解决方案都不是IMHO可以接受的
将部分处理推迟到新事务将破坏工作单元的原子性(全部或无),更改级联类型将意味着您手动处理之前自动级联的所有操作
正确的方法是理解为什么hibernate遇到两个具有相同标识符的不同对象实例,最常见的原因是您手动持久化(保存)具有固定标识符的分离/临时对象,而该对象已存在于会话中(具有相同标识符的托管对象已存在于会话中).
您可以尝试手动重新附加(合并/更新/保存或更新)导致问题的分离对象实例
你必须意识到这一点,才能正确理解这里发生了什么