2017-08-31 1 views
6

Ich habe drei Kotlin die Klassen repräsentieren Hibernate Entitäten:Zwingende Kotlin Eigentum Setter führt zu zwei 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() 
     } 
} 

Hinweis Ich brauche die Setter außer Kraft zu setzen für iddoSomething danach zu rufen. So habe ich es vorher in Java gemacht.

Es baut richtig, aber Hibernate ist es nicht mag:

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

Von einem anderen Fehler ich die außer Kraft gesetzt id vermuten, ist nicht richtig außer Kraft gesetzt und Hibernate sieht die id Spalten zweimal - von Parent und Child2.

+0

Müssen Sie wirklich Anmerkungen zu der überschriebenen Version von 'id' hinzufügen? (Ich habe es nicht versucht) – Xvolks

+0

Ich habe das auch versucht, aber dann führt es zu: 'Wiederholte Spalte im Mapping für Entität: Child2 Spalte: id (sollte mit insert =" false "update =" false ")' 'zugeordnet werden –

Antwort

2

I gefunden versehentlich eine Lösung:

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

Der Trick ist:

  1. keinen Wert zum Feld zuweisen
  2. einen Getter zu schaffen zum super
  3. Verknüpfung

Auf diese Weise wird Kotlin kein neues Feld für die Entität erstellen und es wird nur so sein überschreiben Sie den Getter/Setter.

Verwandte Themen