Zgodnie z wymaganiami JPA @Entity
klasy powinny mieć domyślny konstruktor (bez argumentów) do tworzenia instancji obiektów podczas pobierania ich z bazy danych.
W Kotlinie właściwości są bardzo wygodne do zadeklarowania w głównym konstruktorze, jak w poniższym przykładzie:
class Person(val name: String, val age: Int) { /* ... */ }
Ale kiedy konstruktor nie-arg jest zadeklarowany jako pomocniczy, wymaga przekazania wartości dla konstruktora głównego, więc potrzebne są dla nich pewne prawidłowe wartości, jak tutaj:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
W przypadku, gdy właściwości mają bardziej złożony typ niż tylko String
i Int
nie dopuszczają wartości null, podanie wartości dla nich wygląda zupełnie źle, zwłaszcza gdy jest dużo kodu w głównym konstruktorze i init
blokach oraz gdy parametry są aktywnie używane - - kiedy mają zostać ponownie przypisane poprzez odbicie, większość kodu zostanie ponownie wykonana.
Ponadto, val
-właściwości nie mogą być ponownie przypisane po wykonaniu konstruktora, więc niezmienność również zostaje utracona.
Pytanie brzmi więc: w jaki sposób można dostosować kod Kotlin do pracy z JPA bez duplikowania kodu, wybierając „magiczne” wartości początkowe i utratę niezmienności?
PS Czy to prawda, że Hibernate poza JPA może konstruować obiekty bez domyślnego konstruktora?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- więc tak, Hibernate może działać bez domyślnego konstruktora.