Come richiesto da JPA, le @Entity
classi dovrebbero avere un costruttore predefinito (non arg) per creare un'istanza degli oggetti quando vengono recuperati dal database.
In Kotlin, le proprietà sono molto convenienti da dichiarare nel costruttore principale, come nell'esempio seguente:
class Person(val name: String, val age: Int) { /* ... */ }
Ma quando il costruttore non arg viene dichiarato come secondario, richiede che vengano passati i valori per il costruttore primario, quindi per loro sono necessari alcuni valori validi, come qui:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
Nel caso in cui le proprietà abbiano un tipo più complesso di un semplice String
e Int
non siano annullabili, sembra del tutto negativo fornire i valori per loro, specialmente quando c'è molto codice nel costruttore e nei init
blocchi primari e quando i parametri vengono utilizzati attivamente - - quando devono essere riassegnati attraverso la riflessione, la maggior parte del codice verrà eseguita nuovamente.
Inoltre, le val
proprietà non possono essere riassegnate dopo l'esecuzione del costruttore, quindi si perde anche l'immutabilità.
Quindi la domanda è: come si può adattare il codice Kotlin per lavorare con JPA senza duplicazione del codice, scegliendo valori "magici" iniziali e perdita di immutabilità?
PS È vero che l'ibernazione a parte JPA può costruire oggetti senza costruttore predefinito?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- quindi sì, Hibernate può funzionare senza il costruttore predefinito.