Pourquoi tout le monde de mettre des annotations sur les getters ou setters lors de l'utilisation de JPA pour mapper les classes?
Sujet dit tout... je ne vois pas d'avantage de personnes déclarant des annotations sur les getters et/ou setters jusqu'à présent. Pour moi cela n'a l'inconvénient de répandre les annotations sur la classe, ce qui peut rendre la classe plus illisible.
Mettre des annotations sur les champs clairement réduit la quantité de code à poster quand ont besoin d'aide. C'est juste un petit avantage cependant. Mais mettre des annotations sur les méthodes ne servirait à rien pour moi.
Vous devez vous connecter pour publier un commentaire.
Mettre des annotations sur les méthodes des forces de JPA pour accéder à des propriétés par l'intermédiaire des méthodes. Il est logique lorsque l'état interne de l'objet diffère du schéma de base de données:
En JPA 2.0, vous pouvez spécifier le type d'accès à grain fin de niveau avec
@Access
:Comme déjà mentionné, à l'aide de l'accès à la propriété permet d'ajouter de la logique dans la lecture, si le besoin s'en fait sentir.
Mais puisque la question est étiqueté hibernate, je vais vous parler de l'autre (énorme) avantage: l'accès à la propriété vous permet d'appeler
foo.getId()
sans initialisation d'un proxy. Vous ne pouvez pas obtenir le même comportement lors de l'utilisation sur le terrain. Emmanuel Bernard explique cette limitation de l'accès aux champs comme suit:Donc oui, à l'aide de l'accès à la propriété rend le code plus difficile à lire, vous avez par exemple pour parcourir l'ensemble de la classe pour voir s'il y a des
@Transient
autour de là. Mais pour moi, l'avantage (au moins avec hibernate) l'emporte à cet inconvénient, et de loin.Questions connexes
Références
Les réponses données sont correctes. L'annotation des méthodes plutôt que des propriétés vous donne:
Le droit d'utiliser getId(), si elle est marquée comme l' @valeur de l'Id, pour obtenir une valeur de clé étrangère à partir d'un objet proxy sans réellement le charger à partir de la DB.
Vous pouvez créer des getters/setters de mise à jour interne de l'état de l'objet qui n'est pas dans la base de données. J'ai utilisé ce lors de la récupération de comprimé de l'état à partir de la DB que j'ai envie de décompresser à l'intérieur de l'objet dans un plus utilisable membre interne du zéro des cartes. Les setters et getters définir et obtenir l'état comprimé, et la base de données et mise en veille prolongée n'est pas "savoir" à propos de la non compressé membre interne.
Il ya un inconvénient que j'ai frappé:
A. Votre setters être assez simple. Hibernate s'attend à faire ce serait accompli par l'affectation directe d'un membre du zéro des cartes. Un "setCategory" méthode qui ne donne pas seulement une catégorie, mais aussi les mises à jour de la Catégorie pertinente de l'objet de montrer la relation, peut vous causer des ennuis.
Je suis à l'aide d'annotations sur les getters/setters parce que j'ai une API séparé de la mise en œuvre, et je voulais garder l'API partie complètement cadre-gratuit, me permettant de basculer de cadres ou de fournir des implémentations différentes. Par exemple, en ce moment je suis en utilisant spring-data-jpa, mais avec l'API ci-dessous, je peux facilement passer pour le printemps-jdbc ou de tout autre cadre.
Ce que j'ai fait a été de définir les interfaces du contrôleur, du référentiel et de l'entité, en tant que tel:
Prochaine je viens de mettre en œuvre les MyEntity comme suit, et l'utilisation de la MyEntityImpl pour le Contrôleur, le Service et le Référentiel des implémentations:
J'ai déjà testé et il fonctionne très bien. Juste en annotant la
MyEntityImpl
avec@Entity
n'aurait pas travaillé, comme la super-classe doit être une@MappedSuperclass
.