压倒Kotlin的财产制定者导致两个JPA @Id

时间:2017-08-31 15:24:31

标签: java hibernate jpa kotlin

我有三个代表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完成的方式。

它构建正确,但Hibernate不喜欢它:

A foreign key refering Child2 from ... has the wrong number of column. Should be 2.

从其他一些错误中我怀疑覆盖id没有被正确覆盖,Hibernate会从idParent两次看到Child2列。

1 个答案:

答案 0 :(得分:2)

我偶然发现了一个解决方案:

override var id: Long?
    get() = super.id
    set(value) {
        super.id = value
        doSomething()
    }

诀窍是:

  1. 未向字段分配值
  2. 创建链接到super
  3. 的getter

    这样Kotlin就不会在实体上创建一个新字段,它只会覆盖getter / setter。