web-dev-qa-db-fra.com

Quelles propriétés @Column columnDefinition rend-il redondant?

Je précise souvent mon @Column annotations comme celle-ci:

@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)

Comme vous pouvez le voir, je spécifie length et nullable même si le columnDefinition les spécifie déjà. C'est parce que je ne sais pas où/quand ces valeurs sont utilisées exactement.

Ainsi, lorsque vous spécifiez columnDefinition, quelles autres propriétés de @Column sont licenciés?

Si cela compte, j'utilise Hibernate et PostgreSQL

44
Bart van Heukelom

Ma réponse: Tous les éléments suivants doivent être remplacés (c.-à-d. Les décrire tous dans columndefinition, le cas échéant)):

  • length
  • precision
  • scale
  • nullable
  • unique

c'est-à-dire que la colonne DDL sera composée de: name + columndefinition et rien d'autre .

La justification suit.


  1. L'annotation contenant le mot "Colonne" ou "Table" est purement physique - propriétés uniquement utilisées pour contrôler DDL/DML par rapport à la base de données.

  2. Autres annotations purement logiques - propriétés utilisées en mémoire dans Java pour contrôler le traitement JPA.

  3. C’est pourquoi il semble parfois que l’option optionnalité/nullabilité est définie deux fois - une fois via @Basic(...,optional=true) et une fois via @Column(...,nullable=true). L'ancien dit que l'attribut/l'association peut être nul dans le modèle objet JPA (en mémoire), au moment du vidage; ce dernier indique que la colonne DB peut être nulle. Habituellement, vous voudriez qu'ils aient la même configuration - mais pas toujours , en fonction de la configuration et de la réutilisation des tables de base de données.

Dans votre exemple, les propriétés length et nullable sont remplacées et redondantes.


Ainsi, lorsque vous spécifiez columnDefinition, quelles autres propriétés de @Column sont redondantes?

  1. Dans JPA Spec & javadoc:

    • columnDefinition definition: Le fragment SQL utilisé lors de la génération du DDL pour la colonne.

    • columnDefinition défaut: SQL généré pour créer une colonne du type inféré.

    • Les exemples suivants sont fournis:

      @Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL")
      @Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
      
    • Et, euh ... c'est tout. : - $?!

    columnDefinition remplace-t-il les autres propriétés fournies dans la même annotation?

    Les spécifications javadoc et JPA ne traitent pas explicitement de cette question, car elles ne protègent pas parfaitement. Pour être sûr à 100%, testez avec l'implémentation choisie.

  2. Les exemples suivants peuvent être déduits des exemples fournis dans la spécification JPA

    • name & table peut être utilisé conjointement avec columnDefinition, aucun des deux n'est surchargé
    • nullable est remplacé/redondant par columnDefinition
  3. Ce qui suit peut être implicite de manière assez sûre de la "logique de la situation" (est-ce que je viens de dire cela ?? :-P):

    • length, precision, scale sont écrasés/rendus redondants par le columnDefinition - ils font partie intégrante du type
    • insertable et updateable sont fournis séparément et ne sont jamais inclus dans columnDefinition, car ils contrôlent la génération SQL en mémoire avant son envoi à la base de données. =
  4. Cela ne laisse que la propriété "unique". Cela ressemble à nullable - étend/qualifie la définition de type, elle devrait donc être traitée comme faisant partie intégrante de la définition de type. c'est-à-dire devrait être remplacé.


Testez ma réponse Pour les colonnes "A" et "B", respectivement:

  @Column(name="...", table="...", insertable=true, updateable=false,
          columndefinition="NUMBER(5,2) NOT NULL UNIQUE"

  @Column(name="...", table="...", insertable=false, updateable=true,
          columndefinition="NVARCHAR2(100) NULL"
  • confirmer que la table générée a le type/nullability/uniqueness correct
  • éventuellement, JPA insère et met à jour: ancien doit inclure la colonne A, deuxième colonne B
65
Glen Best

columnDefinition remplacera le DDL sql généré par hibernate pour cette colonne particulière, il est non portable et dépend de la base de données utilisée. Vous pouvez l'utiliser pour spécifier nullable, longueur, précision, échelle ... ect.

5
Septem