spring data jpa 报错 org.hibernate.PersistentObjectException: detached entity passed to persist
导致原因
如有A,B,C三个实体,其中A与B的关系为OneToMany,A中直接传入B的List实现级联存储,C与A的关系为ManyToOne,具体看如下三个实体:
class A {
...
@OneToMany(mappedBy = "a", cascade = [CascadeType.ALL])
var bList: MutableList<B>? = null
}
class B {
...
@ManyToOne
@JoinColumn(name = "a_id")
@JsonIgnore
var a: A? = null
}
class C {
...
@ManyToOne
@JoinColumn(name = "a_id")
@JsonIgnore
var a: A? = null
}
报错接口是A的更新接口,更新接口中A传入了bList,在bList被merge后紧接着findOneC对象,因为接口有事务,读出C对象中的A就会报错。
解决办法
- 取消事务,删除
@Transactional
。 - 将级联的 cascade 由 CascadeType.ALL 改为 CascadeType.MERGE。但是创建A时传入bList不会级联存储,更新是可以的。
- 将报错的findOneC对象的代码移到merge bList之前。
参考资料
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »