2017-08-31 74 views
6

我代表休眠實體3科特林的類:重寫科特林的屬性setter引出兩個JPA @Id

@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調用doSomething之後。這是我之前在Java中完成id的方式。

它建立正常,但是Hibernate不喜歡它:

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

從一些其他錯誤我懷疑重寫id沒有正確重寫和Hibernate看到id列的兩倍 - 從ParentChild2

+0

你真的需要在'id'的改寫版本上添加註釋嗎? (沒有嘗試過我自己) – Xvolks

+0

我也嘗試過,但是它會導致:'在實體映射中重複列:Child2列:id(應該用insert =「false」update =「false」映射) –

回答

2

我意外地發現了一個解決方案:

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

訣竅是:

  1. 不到外地
  2. 創建吸氣鏈接到super

分配值這樣Kotlin就不會在實體上創建一個新的領域,它將會重寫getter/setter。