是否有人有类似的问题删除子记录但未使用orphanRemoval注释?
下面是我在Model Class构造函数中的代码示例:
@OneToMany(orphanRemoval = true, cascade = arrayOf(CascadeType.ALL))
@JoinColumn(name = "categoryId", nullable = false)
var books: List<BOOK> = emptyList()
使用 cascade = arrayOf(CascadeType.ALL) 的CRUD工作正常,但添加 orphanRemoval = true < / strong>进入“ONE-TO-MANY”注释,它无法再工作并抛出异常,如下所示:
org.hibernate.HibernateException:一个集合 所有者不再引用cascade =“all-delete-orphan” 实体实例:
添加orphanRemoval以从数据库中永久删除子记录的目的。
答案 0 :(得分:0)
有一篇博客文章解释了导致此类异常的原因:http://www.onkarjoshi.com/blog/188/hibernateexception-a-collection-with-cascade-all-delete-orphan-was-no-longer-referenced-by-the-owning-entity-instance/
您正在通过setter设置新集合,从而使原始集合不会被Parent实体取消引用。这与Hibernate的搭配并不顺利,让人不知道该做些什么。
books
是var
,而不是val
所以我假设您在代码中的某个位置将其设置为所需的值。假设博客文章的推理在这里有效,那么使用final
可变类型的字段应该是可行的,
val books: MutableList<BOOK> = mutableListOf()
答案 1 :(得分:0)
@OneToMany(cascade = arrayOf(CascadeType.ALL), orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name = "categoryId", nullable = false)
var books: MutableList<BOOK> = mutableListOf()
set(value) {
field.clear()
field.addAll(value)
}