小米笔记 - 坏记性不如烂笔头

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就会报错。

解决办法

  1. 取消事务,删除 @Transactional
  2. 将级联的 cascade 由 CascadeType.ALL 改为 CascadeType.MERGE。但是创建A时传入bList不会级联存储,更新是可以的。
  3. 将报错的findOneC对象的代码移到merge bList之前。

参考资料

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »