Gemäß JPA @Entity
sollten Klassen über einen Standardkonstruktor (ohne Argumente) verfügen, um die Objekte beim Abrufen aus der Datenbank zu instanziieren.
In Kotlin lassen sich Eigenschaften sehr bequem im primären Konstruktor deklarieren, wie im folgenden Beispiel:
class Person(val name: String, val age: Int) { /* ... */ }
Wenn der Nicht-Arg-Konstruktor jedoch als sekundärer deklariert wird, müssen Werte für den primären Konstruktor übergeben werden, sodass einige gültige Werte für sie erforderlich sind, wie hier:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
Für den Fall, dass die Eigenschaften einen komplexeren Typ als nur haben String
und Int
nicht nullwertfähig sind, sieht es völlig schlecht aus, die Werte für sie anzugeben, insbesondere wenn der primäre Konstruktor und die init
Blöcke viel Code enthalten und die Parameter aktiv verwendet werden. - Wenn sie durch Reflexion neu zugewiesen werden sollen, wird der größte Teil des Codes erneut ausgeführt.
Darüber hinaus können val
Eigenschaften nach der Ausführung des Konstruktors nicht neu zugewiesen werden, sodass auch die Unveränderlichkeit verloren geht.
Die Frage ist also: Wie kann Kotlin-Code für die Arbeit mit JPA ohne Codeduplizierung angepasst werden, indem "magische" Anfangswerte ausgewählt werden und die Unveränderlichkeit verloren geht?
PS Stimmt es, dass der Ruhezustand neben JPA Objekte ohne Standardkonstruktor erstellen kann?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- Ja, der Ruhezustand kann ohne den Standardkonstruktor funktionieren.