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
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.
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.
Autres annotations purement logiques - propriétés utilisées en mémoire dans Java pour contrôler le traitement JPA.
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?
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.
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
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 typeinsertable
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. =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"
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.