目录

导致原因

如有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之前。

参考资料