web-dev-qa-db-fra.com

Java Persistence / JPA: @Column vs @Basic

Quelle est la différence entre @Column et @Basic annotations dans JPA? Peuvent-ils être utilisés ensemble? Faut-il ils doivent être utilisés ensemble? Ou l'un d'eux suffit-il?

113
Hosam Aly
  • @Basic signifie qu'un attribut doit être conservé et qu'un mappage standard doit être utilisé. Il a des paramètres qui vous permettent de spécifier si l'attribut doit être chargé paresseux et s'il est nullable.

  • @Column vous permet de spécifier le nom de la colonne de la base de données dans laquelle l'attribut doit être conservé.

Si vous en spécifiez un sans l'autre, vous obtiendrez un comportement par défaut, ce qui est judicieux. Par conséquent, les utilisateurs n'en utilisent généralement qu'un, à l'exception des cas particuliers.

Donc, si nous voulions charger un attribut paresseux et spécifier un nom de colonne, nous pouvons dire

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

Si nous avons besoin du comportement par défaut, non paresseux, alors juste le @Column aurait suffi.

142
djna

En plus de réponse de @ djna , il est à noter que @Basic devrait être comparé à @OneToMany, @ManyToOne et @ManyToMany. Un seul de ceux-ci peut être spécifié sur une propriété.

@Column et @JoinColumn peut être spécifié avec n'importe lequel de ces éléments pour décrire les propriétés de colonne de la base de données.

Ce sont deux jeux d'annotations qui peuvent être utilisés ensemble, mais une seule annotation de chaque jeu peut être utilisée à la fois.

47
Hosam Aly

Il est à noter que Basic est conçu pour les champs primitifs.

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

Un attribut de base est un attribut dans lequel la classe d'attribut est un type simple tel que String, Number, Date ou une primitive. La valeur d'un attribut de base peut correspondre directement à la valeur de la colonne dans la base de données.

Les types et les conversions pris en charge dépendent de la plate-forme d'implémentation et de la base de données JPA. Tout attribut de base utilisant un type qui ne correspond pas directement à un type de base de données peut être sérialisé en un type de base de données binaire.

Le moyen le plus simple de mapper un attribut de base dans JPA est de ne rien faire. Tous les attributs qui n'ont pas d'autres annotations et ne font pas référence à d'autres entités seront automatiquement mappés en tant que base, et même sérialisés si ce n'est pas un type de base. Le nom de colonne de l'attribut sera défini par défaut, le même nom que le nom de l'attribut, en majuscule.

21
Gab