todas onetoone onetomany mappedby las ejemplo column anotaciones java hibernate jpa annotations

java - onetoone - ¿Qué hace el atributo de longitud cuando se establece en la anotación @Column JPA?



onetoone jpa (4)

¿Qué hace exactamente la configuración de la longitud en una columna en JPA?

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

Entiendo que puede usar las anotaciones para generar el esquema de la base de datos (DDL) en función de los objetos de la entidad, pero ¿la longitud realiza algún tipo de comprobación o truncamiento cuando ocurre la persistencia, o solo se utiliza para la creación de esquemas?

También me doy cuenta de que JPA puede estar al tanto de varias implementaciones, la implementación que me preocupa en este caso es Hibernate.


¿La longitud realiza algún tipo de comprobación o truncamiento cuando ocurre la persistencia, o solo se utiliza para la creación de esquemas?

El atributo de length de la anotación de Column se usa para especificar:

La longitud de la columna (Se aplica solo si se usa una columna con valores de cadena).

Y solo se usa en el DDL generado. En su ejemplo, la columna resultante se generaría como VARCHAR(32) e intentar insertar una cadena más larga generaría un error de SQL.

Para la validación, puede agregar una @Size(max=32) desde la API de Validación de Bean ( JSR 303 ). Proporcioné una muestra con una prueba ejecutable here .

Proporcionar Size y length puede parecer redundante, pero según el Apéndice D. de la especificación de Validación de frijol, la generación de DDL con conciencia de validación de frijol no es obligatoria para los proveedores de persistencia. Así que use la length para el DDL, @Size para la validación.

En caso de que esté interesado, simplemente ponga una implementación de validación de Bean en el classpath con JPA 2.0. Con JPA 1.0, consulte esta respuesta anterior .


@column (length = 32) es solo para DDL y no para restringir significa que permite más de 32 caracteres a menos que a nivel de tabla no esté restringido. Para restringir el tamaño, debemos ir por @size (max = 32)


Hibernate 4.3.11 (y otras versiones) deben prestar atención a las anotaciones de validación. - entonces quizás tengas que actualizar

Estas son citas del manual de Hibernate 4.3.11

Capítulo 22. Módulos adicionales

Hibernate Core también ofrece integración con algunos módulos / proyectos externos. Esto incluye Hibernate Validator, la implementación de referencia de Bean Validation (JSR 303) y Hibernate Search.

Capítulo 22.1 Validación de frijol

... La integración entre Hibernate y Bean Validation funciona en dos niveles. En primer lugar, es capaz de verificar instancias en la memoria de una clase para violaciones de restricciones. En segundo lugar, puede aplicar las restricciones al metamodelo de Hibernate e incorporarlas al esquema de base de datos generado. ...

Capítulo 22.1.4 Esquema de la base de datos

Hibernate usa restricciones de validación de Bean para generar un esquema de base de datos preciso:

@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 :) )

Nota: @Lengh también funciona, como @Size

Cuando utiliza Hibernate Validator 5.1, también necesita una Implementación el. Por ejemplo

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

Si no tiene esto, entonces Hibernate ORM no podrá iniciar la Validación de Hibernación, por lo tanto, no tomará (todos) JSR-303 por ejemplo @Length , @Size en la cuenta.


Por cierto, si no establece la longitud, será 255 por defecto (probado con MySQL)