web-dev-qa-db-fra.com

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

Que fait exactement la définition 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) en fonction des objets d'entité, mais la longueur effectue-t-elle une sorte de vérification ou de troncature lorsque la persistance se produit, ou est-elle uniquement utilisée pour la création de schéma?

Je me rends également compte que JPA peut s'asseoir sur différentes implémentations, l'implémentation qui m'intéresse dans ce cas est Hibernate.

57
James McMahon

La longueur effectue-t-elle une vérification ou une troncature en cas de persistance, ou est-elle uniquement utilisée pour la création de schémas?

L'attribut length de l'annotation Column est utilisé pour spécifier:

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

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


Pour la validation, vous pouvez ajouter un @Size(max=32)contrainte à partir de l'API de validation de bean ( JSR 3 ). J'ai fourni un échantillon avec un test exécutable ici .

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

Si vous êtes intéressé, mettez simplement une implémentation de validation de bean sur le chemin de classe avec JPA 2.0. Avec JPA 1.0, reportez-vous à cette réponse précédente .

79
Pascal Thivent

Btw, si vous ne définissez pas la longueur, ce sera 255 par défaut (testé avec MySQL)

5
cn123h

@column (length = 32) est uniquement à des fins DDL et non à des fins de restriction signifie qu'il autorise plus de 32 caractères, sauf au niveau de la table, il n'est pas restreint. Pour limiter la taille, nous devons choisir @size (max = 32)

3
lingaraju p

Hibernate 4.3.11 (et les autres versions) doit prêter attention aux annotations de validation. - donc vous devrez peut-être mettre à niveau

Ce sont des citations de manuel Hibernate 4.3.11

Chapitre 22.Modules supplémentaires

Hibernate Core offre également une intégration avec certains modules/projets externes. Cela inclut Hibernate Validator, l'implémentation de référence de la validation du bean (JSR 303) et de la recherche Hibernate.

Chapitre 22.1 Validation du bean

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

Chapitre 22.1.4 Schéma de base de données

Hibernate utilise les contraintes de validation de bean 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 :) )

Remarque: @Lengh fonctionne aussi, comme @Size


Lorsque vous utilisez Hibernate Validator 5.1 - vous avez également besoin d'un el-Implementation. Par exemple

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

Si vous ne l'avez pas, alors Hibernate ORM ne pourra pas démarrer Hibernate Validation, et donc il ne prendra pas (tout) JSR-303 par exemple @Length, @Size en compte!

3
Ralph