KOTLIN orphanRemoval 不起作用
Posted
技术标签:
【中文标题】KOTLIN orphanRemoval 不起作用【英文标题】:KOTLIN orphanRemoval not working 【发布时间】:2016-12-26 03:22:54 【问题描述】:是否有人有类似的删除子记录但未能使用 orphanRemoval 注释的问题?
下面是我在模型类构造函数中的代码示例:
@OneToMany(orphanRemoval = true, cascade = arrayOf(CascadeType.ALL))
@JoinColumn(name = "categoryId", nullable = false)
var books: List<BOOK> = emptyList()
带有 cascade = arrayOf(CascadeType.ALL) 的 CRUD 工作得很好,但是当添加 orphanRemoval = true 进入“ONE-TO-MANY”注解,它不能再工作并抛出异常如下:
org.hibernate.HibernateException:一个集合 cascade="all-delete-orphan" 不再被拥有者引用 实体实例:
添加 orphanRemoval 的目的是从数据库中永久删除子记录。
【问题讨论】:
【参考方案1】:有一篇博文解释了这种异常的可能原因:http://www.onkarjoshi.com/blog/188/hibernateexception-a-collection-with-cascade-all-delete-orphan-was-no-longer-referenced-by-the-owning-entity-instance/
您正在通过 setter 设置新集合,从而使父实体未引用原始集合。这在 Hibernate 中运行得并不好,并且让它不知道该怎么做。
books
是 var
,而不是 val
,所以我假设在您的代码中的某个位置,您将其设置为所需的值。假设博客文章中的推理在这里是有效的,使用可变类型的final
字段应该是可行的方法,
val books: MutableList<BOOK> = mutableListOf()
【讨论】:
【参考方案2】:@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)
【讨论】:
以上是关于KOTLIN orphanRemoval 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Autowire Hashmap 在 kotlin 中不起作用