Kotlin avec JPA: constructeur par défaut de l'enfer

Comme JPA exige, @Entity les classes doivent avoir une valeur par défaut (non-arg) constructeur pour instancier les objets lors de la récupération de la base de données.

Dans Kotlin, les propriétés sont très pratique à déclarer dans le cadre du premier constructeur, comme dans l'exemple suivant:

class Person(val name: String, val age: Int) { /* ... */ }

Mais lorsque la non-arg constructeur est déclaré comme une question secondaire, il exige des valeurs pour les premier constructeur à être transmis, de sorte que certaines valeurs valides sont nécessaires pour eux, comme ici:

@Entity
class Person(val name: String, val age: Int) {
    private constructor(): this("", 0)
}

Dans le cas où les propriétés ont une certaine catégorie plus complexe que juste String et Int et ils sont non nullable, il semble totalement mauvais pour fournir les valeurs pour eux, surtout quand il y a beaucoup de code dans le primaire constructeur et init blocs et lorsque les paramètres sont activement utilisés, quand ils sont pour être réaffectés à travers la réflexion, la plupart du code est va être exécutée de nouveau.

En outre, val-les propriétés ne peuvent pas être réaffectés après le constructeur s'exécute, donc immutabilité est également perdu.

La question est donc: comment peut-Kotlin code de l'adapter aux JPA sans duplication de code, le choix de "magie" des valeurs initiales et la perte de l'immuabilité?

P. S. Est-il vrai que Hibernate côté de JPA peut construire des objets avec pas de constructeur par défaut?

  • INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor) – donc, oui, Hibernate peut fonctionner sans le constructeur par défaut.
  • La façon dont il le fait, c'est avec les poseurs - aka: la Mutabilité. Il instancie le constructeur par défaut et recherche des poseurs. Je veux des objets immuables. La seule façon qui peut être fait est si hiberne commence à regarder le constructeur. Il y a un billet sur ce hibernate.atlassian.net/browse/HHH-9440
InformationsquelleAutor hotkey | 2015-08-16