web-dev-qa-db-fra.com

Hibernate / JPA - annotation des méthodes de bean vs champs

J'ai une question simple sur l'utilisation d'Hibernate. Je continue de voir des gens utiliser les annotations JPA de deux manières en annotant les champs d'une classe et aussi en annotant la méthode get sur les beans correspondants.

Ma question est la suivante: existe-t-il une différence entre les champs d'annotation et les méthodes de bean avec des annotations JPA telles que @Id.

exemple:

@Entity
public class User
{

**@ID**
private int id;

public int getId(){
return this.id;
}

public void setId(int id){
this.id=id;
}

}

-----------OU-----------

@Entity
public class User
{


private int id;

**@ID**
public int getId(){
return this.id;
}

public void setId(int id){
this.id=id;
}

}
35
benstpierre

Oui, je pense que vous souhaitez rechercher sur le terrain par rapport à l'accès à la propriété:

Hibernate Annotations - Quel est le meilleur accès au champ ou à la propriété?

La préférence Spring est accès au champ . Voilà ce que je suis.

15
duffymo

Oui, si vous annotez les champs, Hibernate utilisera l'accès aux champs pour définir et obtenir ces champs. Si vous annotez les méthodes, hibernate utilisera des getters et setters. Hibernate choisira la méthode d'accès en fonction de l'emplacement du @Id annotation et à ma connaissance, vous ne pouvez pas mélanger et assortir. Si vous annotez un champ avec @Id, les annotations sur les méthodes seront ignorées et vice versa. Vous pouvez également définir manuellement la méthode avec l'annotation au niveau de la classe @AccessType

Le Guide de référence des annotations Hibernate s'est avéré être une ressource extrêmement utile pour des questions comme celle-ci et détaille la manière dont les types d'accès descendent en cascade dans les hiérarchies.

43
Steve Skrla

Ma recommandation est d'annoter les méthodes. Ce faisant, vous gagnez un peu de flexibilité. Par exemple, supposons que vous ayez quelques classes:

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

AbstractEntity définit le champ id/getter/setter. Les classes StringIdEntity et AutoIdEntity héritent de AbstractEntity, mais utilisent différentes stratégies @Id. Si vous annotez le champ, vous ne pouvez pas le changer d'une classe à une autre.

Si vous annotez les méthodes, vous marquez getId() comme @Transient/abstract Dans AbstractEntity puis dans les sous-classes, vous remplacez simplement la méthode et appliquez la stratégie que vous souhaitez utiliser. J'avais l'habitude d'annoter les champs moi-même et je suis tombé sur cela et j'ai décidé que j'allais toujours annoter les méthodes à l'avenir.

Ainsi, même si vous ne voyez pas immédiatement les avantages des méthodes d'annotation, cela peut devenir évident en fin de compte lorsque vous avez tant de classes que le changement va devenir un véritable casse-tête.

4
Brian

Pourquoi annoteriez-vous les accesseurs? Il semble tout simplement désordonné et est une douleur à maintenir. Maintenant, je dois chasser partout dans la classe pour savoir comment JPA ou Hibernate est appliqué. Lorsque vous travaillez avec certains plugins de génération de code Hibernate pour Eclipse, c'est la valeur par défaut et cela me rend bonkers.

Sans oublier qu'une autre raison pour laquelle nous utilisons des accesseurs est d'ajouter de la logique à l'accès à la propriété ou au parent de référence ou à un autre objet qui ne se marie pas bien avec lesdites annotations.

3
Joseph Lust

Il existe plusieurs discussions disponibles qui permettent à Edge d'utiliser la propriété FIELD over (voir - http://Java.dzone.com/tips/12-feb-jpa-20-why-accesstype ). Même le framework Spring recommande également d'utiliser FIELD sur la propriété (voir - http://static.springsource.org/spring/docs/2.5.x/reference/orm.html ). Je trouve l'approche FIELD plus propre non seulement parce que vous n'êtes pas obligé d'implémenter des setters/getters mais vous pouvez avoir vos setters/getters de type personnalisé dans votre classe. Donc une meilleure encapsulation et des classes plus propres. En termes de performances, FIELD a un peu plus de PROPRIÉTÉ mais qui est négligeable.

EN UNE LIGNE, utilisez FIELD over PROPERTY. Utilisez la propriété si vous en avez vraiment besoin.

2
Mohammad Adnan