重写Kotlin的财产二传导致两个JPA @Id

我有三个代表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列两次 – 从ParentChild2

我无意中发现了一个解决方案:

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

诀窍是:

  1. 不为该字段分配值
  2. 创建一个连接到super的getter

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