我有三个代表 Hibernate 实体的 Kotlin 类:
@MappedSuperclass
abstract class Parent {
@Id @GeneratedValue @Column(nullable=false)
var id: Long? = null
}
@Entity
class Child1 {}
@Entity
class Child2 {
@Id @GeneratedValue @Column(nullable=false)
override var id: Long? = null
set(value) {
super.id = value
doSomething()
}
}
注意,我需要重写 id
的 setter 以便之后调用 doSomething
。这就是我之前在Java中完成id的方式。
它构建正确,但 Hibernate 不喜欢它:
A foreign key refering Child2 from ... has the wrong number of column. Should be 2.
由于其他一些错误,我怀疑覆盖的 id
未正确覆盖,并且 Hibernate 两次看到 id
列 - 来自 Parent
和 Child2
.
最佳答案
我无意中找到了解决方案:
override var id: Long?
get() = super.id
set(value) {
super.id = value
doSomething()
}
诀窍是:
- 未给字段赋值
- 创建一个链接到
super
的 getter
这样 Kotlin 就不会在实体上创建新字段,而只会覆盖 getter/setter。
关于java - 重写 Kotlin 的属性 setter 会导致两个 JPA @Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985070/