Est-il possible d'avoir des champs immuables dans Hibernate / JPA?
Dans notre application, nous avons besoin d'avoir des champs qui sont cessibles qu'une seule fois.
Au début, nous avons pensé à l'encapsulation des champs et de faire les opérateurs privés. Cependant, certaines questions suscitent:
- Sans un public setter, Hibernate est encore en mesure de cartographier le champ de la base de données?
- Puis-je extraire le setter et de rendre le champ mutable seulement dans l'entité constructeur?
- Enfin, est-il un standard JPA façon à en faire un terrain d'immuable?
Merci d'avance.
source d'informationauteur EdMelo
Vous devez vous connecter pour publier un commentaire.
Ad. 1: je crois que JPA utilise la plaine de champs privés pour lire et écrire si les annotations sont placés sur les champs et non pas sur les méthodes de lecture. Récemment, j'ai découvert que Hiberner comme un sous-jacent JPA fournisseur n'a même pas besoin
get*()
etset*()
méthodes. C'était vraiment instructif solution puisque dès le début, j'ai pensé que Hibernate a besoin accesseurs. Donc la réponse est: vous n'avez pas besoin de setters autant que la mise en veille.Ad. 2: Cependant, veuillez noter que Hibernate a encore besoin de pas-arg constructeur, sinon il ne pourra pas charger les entités avec un descriptif exception. C'est aussi une JPA exigence.
Ad. 3: Non, il n'y en a pas. Rappelez-vous que vos collections aurait également dû être immuable.
Essayer
Et faire de votre setter privé. (Laissez votre de lecture publique si vous le souhaitez)
Je pense que c'est la meilleure pratique.
P. S.: JPA utilise accès sur le terrain si vous annoter vos champs et utilise des getter/setter accès si vous annoter votre méthode de lecture.
En JPA 2.0, vous avez deux façons de définir quels sont les attributs doivent être conservées:
En l'absence d'Accès(-) annotation est utilisée, la décision que l'accès sera utilisé dépend de l'endroit où vous mettez votre annotation @Id. Si vous mettez à côté de votre domaine d'Accès(sur le TERRAIN) sera utilisé. Si vous mettez à côté de votre accesseur d'Accès(PROPRIÉTÉ) sera utilisé.
Par conséquent, si vous utilisez Access(sur le TERRAIN) vous n'avez pas à avoir une JavaBeans style accesseur pour le domaine particulier. Vous pouvez avoir un domaine privé nommé "myField" et un public setter pour cela nommé " public setBlahBlah(-)'. La JPA va persister seulement le "myField'.
Essayer
De javadoc:
Vous pouvez marquer une entité avec
@Entity(mutable=false)
ou@Immutable
des annotations pour le cadre à utiliser ce fait pour le gain de performance dans la mise en cache et. (Hibernate)Ensuite, vous pouvez utiliser un immuable classe wrapper comme ceci: