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 中运行得并不好,并且让它不知道该怎么做。

booksvar,而不是 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JPA/Hibernate 级联删除不起作用

kotlin 中的 supportFragmentManager.commit 不起作用

为啥请求 http 在 Kotlin 中不起作用?

xml onClick 中的 Kotlin 不起作用

Spring Autowire Hashmap 在 kotlin 中不起作用

在 Kotlin 中获取新用户位置不起作用