71 votes

Que fait l'attribut length lorsqu'il est défini sur l'annotation JPA @Column ?

Que fait exactement le réglage de la longueur d'une colonne dans JPA ?

@Column(name = "middle_name", nullable = false, length = 32)
public String getMiddleName() {
    return this.middleName;
}

Je comprends que vous pouvez utiliser les annotations pour générer le schéma de base de données (DDL) basé sur les objets d'entité, mais est-ce que la longueur effectue une sorte de vérification ou de troncation lorsque la persistance se produit, ou est-elle uniquement utilisée pour la création de schéma ?

Je suis également conscient que JPA peut se situer au-dessus de diverses implémentations, l'implémentation qui me concerne dans ce cas est Hibernate.

0 votes

Par ailleurs, si vous ne définissez pas la longueur, elle sera de 255 par défaut (testé avec MySQL).

97voto

Pascal Thivent Points 295221

La longueur effectue-t-elle une sorte de contrôle ou de troncature lorsque la persistance se produit, ou est-elle uniquement utilisée pour la création de schémas ?

Le site length de l'attribut Column est utilisée pour le spécifier :

La longueur de la colonne. (S'applique uniquement si une colonne à valeur de chaîne est utilisée).

Et n'est utilisé que dans la DDL générée. Dans votre exemple, la colonne résultante serait générée en tant que VARCHAR(32) et essayer d'insérer une chaîne plus longue entraînerait une erreur SQL.


Pour la validation, vous pourriez ajouter un @Size(max=32) contrainte de l'API de validation des haricots ( JSR 303 ). J'ai fourni un échantillon avec un test exécutable. ici .

Fournir à la fois Size y length peut sembler redondant mais selon le Annexe D. de la spécification Bean Validation, la génération de DDL compatibles avec Bean Validation n'est pas obligatoire pour les fournisseurs de persistance. Utilisez donc length pour la DDL, @Size pour la validation.

Au cas où vous seriez intéressé, il suffit de mettre une implémentation de Bean Validation sur le classpath avec JPA 2.0. Avec JPA 1.0, référez-vous à ceci réponse précédente .

2 votes

Merci, je m'en doutais. Avez-vous par hasard une citation qui dit que l'annotation est seulement pour la DDL ? Je n'ai pas trouvé d'indication explicite dans la documentation.

1 votes

J'ai essayé d'utiliser les deux @Size(max=32) y @Column(length=128) et malheureusement @Size semble avoir la priorité. Il s'agit peut-être d'un bogue d'Hibernate.

1 votes

Par exemple, lorsque je crée une colonne d'une longueur de 1500, elle est générée en tant que "TEXT" dans MySql. Comment la restriction de taille s'applique-t-elle dans ce cas ? Ou s'applique-t-elle tout court ? Merci.

6voto

Ralph Points 42744

Hibernate 4.3.11 (et les autres versions) doit faire attention aux annotations de validation. - Vous devez donc peut-être mettre à jour

Ce sont des citations de Manuel d'Hibernate 4.3.11

Chapitre 22. Modules supplémentaires

Hibernate Core offre également l'intégration avec certains systèmes externes. modules/projets externes. Il s'agit notamment d'Hibernate Validator, l'implémentation de référence de la validation des beans (JSR 303) et Hibernate Search.

Chapitre 22.1 Validation des haricots

... L'intégration entre Hibernate et Bean Validation fonctionne à deux niveaux. Premièrement, elle est capable de vérifier les instances en mémoire d'une classe pour les les violations de contraintes. Deuxièmement, il peut appliquer les contraintes à la classe métamodèle Hibernate et les incorporer dans le schéma de base de données généré. de base de données générée. ...

Chapitre 22.1.4 Schéma de la base de données

Hibernate utilise les contraintes Bean Validation pour générer un schéma de base de données précis :

@NotNull leads to a not null column (unless it conflicts with components or table inheritance)

@Size.max leads to a varchar(max) definition for Strings

@Min, @Max lead to column checks (like value <= max)

@Digits leads to the definition of precision and scale (ever wondered which is which? It's easy now with @Digits :) )

Note : @Lengh fonctionne aussi, comme @Size


Lorsque vous utilisez Hibernate Validator 5.1, vous avez également besoin d'une implémentation. Par exemple

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
</dependency>

Si vous n'avez pas cette information, Hibernate ORM ne sera pas en mesure de lancer Hibernate Validation, et par conséquent il ne prendra pas (tout) JSR-303 par exemple @Length , @Size en compte !

1 votes

Ainsi, si j'empêche Hibernate de créer le schéma et que je crée moi-même la table avec SQL, je n'ai pas besoin d'indiquer @Column(length=...) et ainsi de suite, n'est-ce pas ? Je ne vérifie que les @Size , @Max avant persistant, est-ce exact ?

1 votes

@WesternGun : oui, mais @Column(name="xxx") est encore nécessaire

0 votes

Merci (même si je dirais que name="xxx" serait inutile si le nom de la colonne est exactement le même que celui du champ, mais ce n'est généralement pas le cas)

5voto

lingaraju p Points 1

@Column(length=32) est uniquement destiné à des fins de DDL et non de restriction, ce qui signifie qu'il autorise plus de 32 caractères, à moins qu'il n'y ait pas de restriction au niveau de la table. @Size(max=32)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X