Confusión: @NotNull vs @ Column (nullable = false)


  1. Cuando aparecen en un campo/captador de un @Entity, ¿cuál es la diferencia entre ellos? (Persisto la Entidad a través de Hibernar ).

  2. ¿A qué marco y / o especificación pertenece cada uno de ellos?

  3. @NotNull se encuentra dentro de javax.validation.constraints. En el javax.validation.constraints.NotNull javadoc dice

    El elemento anotado no debe ser null

    Pero no habla de la representación del elemento en la base de datos, así que ¿por qué añadiría la restricción nullable=false a la columna?

Author: Karl Richter, 2011-09-16

3 answers

@NotNull es una anotación JSR 303 Bean Validation. No tiene nada que ver con las restricciones de la base de datos en sí. Como Hibernate es la implementación de referencia de JSR 303, sin embargo, recoge inteligentemente estas restricciones y las traduce en restricciones de base de datos para usted, por lo que obtiene dos por el precio de uno. @Column(nullable = false) es la forma de JPA de declarar una columna como not-null. Es decir, el primero está destinado a la validación y el segundo para indicar el esquema de la base de datos detalles. Usted está recibiendo un poco de extra (y bienvenido!) ayuda de Hibernate sobre las anotaciones de validación.

 254
Author: Ryan Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-03 06:30:23

Las versiones más recientes del proveedor hibernate JPA aplican las restricciones de validación de bean (JSR 303) como @NotNull a DDL por defecto (gracias a hibernate.validator.apply_to_ddl property por defecto a true). Pero no hay garantía de que otros proveedores de JPA hagan o incluso tengan la capacidad de hacer eso.

Debe usar anotaciones de validación de bean como @NotNull para asegurarse de que las propiedades de bean se establecen en un valor none-null, al validar java beans en la JVM (esto no tiene nada que ver con las restricciones de la base de datos, pero en la mayoría de los casos las situaciones deben corresponderles).

Debe usar adicionalmente la anotación JPA como @Column(nullable = false) para dar al proveedor de jpa consejos para generar el DDL correcto para crear columnas de tabla con las restricciones de base de datos que desee. Si puede o desea confiar en un proveedor de JPA como Hibernate, que aplica las restricciones de validación de bean a DDL de forma predeterminada, puede omitirlas.

 8
Author: Sebastian Theek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-11 03:58:26

Es interesante observar que todas las fuentes enfatizan que @Column(nullable=false) se usa solo para la generación de DDL.

Sin embargo, incluso si no hay anotación @NotNull, e hibernar.la opción check_nullability se establece en true, Hibernate realizará la validación de las entidades que se persistirán.

Lanzará PropertyValueException diciendo que "not-null property hace referencia a un valor null o transitorio", si los atributos nullable = false no tienen valores, incluso si tales restricciones no lo son implementado en la capa de base de datos.

Más información sobre hibernate.la opción check_nullability está disponible aquí: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping.

 4
Author: Aleksandar Radulović,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-21 11:42:13