Spring Data JPA手动Detach实体后自动Flush触发持久化错误排查
JPA事务中分离实体后触发Flush报错问题
在基于Spring 3.2.1、Spring Data JPA 1.3.0、Hibernate 4.1.9及hibernate-jpa-2.0-api:1.0.1.Final的旧项目中,所有操作在单个事务内执行,操作流程如下:
- 从CrudRepository实现类中获取一个实体,仅使用其部分数据;
- 调用
entityManager.detach(entity);手动将该实体从持久化上下文分离; - 紧接着从另一个CrudRepository实现类中获取另一个实体;
- 执行第三步时触发JPA自动Flush操作,此时抛出
detached entity passed to persist错误。
我理解该错误的含义,但无法理解为何系统会尝试持久化已被分离的实体。原本认为detach操作会将实体从持久化上下文完全移除,自动Flush时不会再处理该实体,但实际情况并非如此。
我曾找到完全相同的问题,但未获得直接解答。现有方案建议使用entityManager.clear(),但该操作会清空整个持久化上下文,不符合我的需求——我仅需要分离这单个实体,同时保持其他实体处于托管状态。
需要分离该实体的原因是:项目中存在并发问题,且该实体的状态存在被意外覆盖到数据库的情况。
内容的提问来源于stack exchange,提问作者Yovi
相关产品推荐
相关产品推荐

