Persistance Java / JPA: @Column vs @Basic

119

Quelle est la différence entre les annotations @Columnet @Basicdans JPA? Peuvent-ils être utilisés ensemble? Devraient- ils être utilisés ensemble? Ou est-ce que l'un d'eux suffit?

Hosam Aly
la source

Réponses:

147
  • @Basicsignifie 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é paresseusement 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 spécifiez l'un sans l'autre, vous obtenez un comportement par défaut, ce qui est raisonnable, de sorte que les gens n'en utilisent généralement qu'un, à l'exception de cas spéciaux.

Donc, si nous voulions un chargement paresseux d'un attribut 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 @Columnaurait été suffisant.

djna
la source
2
C'est une réponse claire. Je vous remercie. Je suppose donc que l'on peut utiliser @Basicsans @Column, c'est pourquoi les propriétés optionalet nullableexistent dans les deux. Ai-je raison?
Hosam Aly le
1
Je ne prétends pas comprendre pleinement la spécification JPA sur les différences entre le nullable de @ Basic et le nullable de @ Column et l'effet de spécifier ni l'un ni l'autre, ni les deux. @Basic nullable est décrit comme un "indice" avec pertinence pour la génération de schéma. @Column nullable est décrit comme définissant les caractéristiques de la colonne dans la base de données. Ma pratique serait d'utiliser le cas @Column.
djna
16
@Basic (facultatif) est (devrait être) vérifié à l'exécution par le fournisseur de persistance avant d'enregistrer dans la base de données. @Column est une définition de colonne dans la base de données et est utilisé pour la génération de schéma: stackoverflow.com/questions/2899073/…
Piotr Gwiazda
2
que «non paresseux», appelle EAGER. LOL
solvator
7
Les annotations JPA peuvent être divisées en deux groupes: les annotations relationnelles pures par rapport aux annotations d'implémentation. Les annotations relationnelles pures contiennent: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... tandis que les annotations d'implémentation donnent des indices sur la façon de mapper le modèle théorique pur à une base de données réelle: Table, Column, ... Dans votre question 'Basic 'est une annotation pour fournir des informations sur l'attribut d'entité relationnelle tandis que' Column 'fournit des informations sur la façon de le mapper à une colonne de base de données.
Bruno Ranschaert
50

En plus de la réponse de @ djna , il convient de noter qu'il @Basicfaut comparer avec @OneToMany, @ManyToOneet @ManyToMany. Un seul de ces éléments peut être spécifié sur une propriété.

@Columnet @JoinColumnpeut être spécifié avec l'un de ceux-ci pour décrire les propriétés de la colonne de base de données.

Il s'agit de deux ensembles d'annotations qui peuvent être utilisés ensemble, mais une seule annotation de chaque ensemble peut être utilisée à la fois.

Hosam Aly
la source
21

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 conversions pris en charge dépendent de l'implémentation JPA et de la plate-forme de base de données. 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 référencent pas d'autres entités seront automatiquement mappés comme de base, et même sérialisés si ce n'est un type de base. Le nom de la colonne de l'attribut sera par défaut, nommé de la même manière que le nom de l'attribut, en majuscules.

Gab
la source
Bonne note. Je vous remercie.
Hosam Aly
1
Non, si aucune annotation de colonne n'est spécifiée, les valeurs par défaut s'appliquent (le nom sera l'attribut un).
Gab
2

L'annotation @Basic est appliquée aux entités JPA, et les de @Column sont appliqués aux colonnes de la base de données L'attribut facultatif de l'annotation @Basic définit si le champ d'entité peut être nul ou non; d'autre part,

  • L'attribut nullable de l'annotation @Column spécifie si la colonne de base de données correspondante peut être nulle
  • Nous pouvons utiliser @Basic pour indiquer qu'un champ doit être chargé paresseusement
  • L'annotation @Column nous permet de spécifier le nom de la colonne de la base de données mappée
  • L'annotation @Basic marque la propriété comme non facultative au niveau de l'objet Java. Et (nullable = false) sur le mappage de colonne, est uniquement responsable de la génération d'une contrainte de base de données NOT NULL.
Sonu Patel
la source