web-dev-qa-db-fra.com

À quoi servent AccessType.FIELD, AccessType.PROPERTY et @Access

Je veux juste savoir quelle est la différence entre toutes ces annotations. Pourquoi utilisons-nous ces ... signifie qu'ils n'ont aucun effet en particulier au niveau du champ et au niveau de la propriété.

Et quel est le but d'utiliser des annotations de niveau mixte comme:

@Entity
@Access(AccessType.FIELD)
class Employee {
    // why their is a field level access 
    private int id;

    // whats the purpose of transient here
    @Transient                               
    private String phnnumber;

    // why its a property level access
    @Access(AccessType.property)             
    public String getPhnnumber() {
        return "1234556";
    }

}

que dit exactement cette classe?

50
Ashish Bansal

Par défaut, le type d'accès est défini par l'endroit où vous placez votre annotation d'identification (@Id). Si vous le mettez sur le terrain - ce sera AccessType.FIELD , si vous le mettez sur le getter - ce sera AccessType.PROPERTY .

Parfois, vous voudrez peut-être annoter non pas des champs mais des propriétés (par exemple parce que vous voulez avoir une logique arbitraire dans le getter ou parce que vous le préférez de cette façon.) Dans une telle situation, vous devez définir un getter et l'annoter comme AccessType.PROPERTY .

Pour autant que je m'en souvienne, si vous spécifiez AccessType.FIELD Ou AccessType.PROPERTY Sur l'un des champs/méthodes d'entité, vous devez spécifier le comportement par défaut pour toute la classe. Et c'est pourquoi vous devez avoir AccessType.FIELD Au niveau de la classe (malgré que AccessType.FIELD Est la valeur par défaut.)

Maintenant, si vous n'aviez pas @Transient Dans le champ phnnumber, le JPA vous fournirait un tableau à 3 colonnes:

  • id,
  • phnnumber,
  • getphnnumber.

En effet, il utiliserait AccessType.FIELD Pour tous les champs d'entité (id et phnnumber) et, en même temps, il utiliserait AccessType.PROPERTY Pour votre getter (getPhnnumber()).
Vous terminerez avec un numéro de téléphone mappé deux fois dans la base de données.

Par conséquent, l'annotation @Transient Est requise - cela signifie que l'entité ne stockera pas la valeur du champ dans le stockage sous-jacent mais la valeur retournée par votre getter .

71
Piotr Nowicki