¿Cuál es la diferencia entre @Basic(optional = false)
y @Column(nullable = false)
en la persistencia de JPA?
¿Cuál es la diferencia entre @Basic(optional = false)
y @Column(nullable = false)
en la persistencia de JPA?
Gordon Yorke (miembro del comité de arquitectura de EclipseLink, líder técnico de TopLink Core, miembro del grupo de expertos de JPA 2.0) escribió una buena respuesta sobre este tema, así que en lugar de parafrasearlo, citaré su respuesta :
La diferencia entre
optional
ynullable
es el alcance en el que se evalúan. La definición de "optional
" habla de valores de propiedad y campo y sugiere que esta característica debe evaluarse dentro del tiempo de ejecución. 'nullable
' solo se refiere a las columnas de la base de datos.Si una implementación opta por implementar
optional
, el proveedor de persistencia debe evaluar esas propiedades en la memoria y generar una excepción antes de que SQL se envíe a la base de datos; de lo contrario, cuando se utilicen violaciones 'updatable=false
' 'optional
', nunca se notificarán.
@Basic(optional = false) @Column(nullable = false)
La anotación @Basic marca la propiedad como no opcional en el nivel del objeto Java. La segunda configuración, anulable = false en el mapeo de la columna, solo es responsable de la generación de una restricción de base de datos NOT NULL. La implementación de Hibernate JPA trata ambas opciones de la misma manera en cualquier caso, por lo que también puede usar solo una de las anotaciones para este propósito.
The @Basic annotation marks the property as not optional on the Java object level.
¿Qué significa eso? Entonces, ¿solo @Basic
es como decir que hace la columna NOT NULL
de la base de datos para dicha variable?
Así que probé la anotación @Basic (opcional = falso) usando JPA 2.1 (EclipseLink) y resulta que la anotación se ignora en el uso real (al menos para un campo String). (por ejemplo, llamadas entityManager.persist).
Así que fui a la especificación y leí al respecto. Esto es lo que dice la especificación:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
Básico (opcional): si el valor del campo o la propiedad puede ser nulo. Esta es una sugerencia y no se tiene en cuenta para los tipos primitivos; se puede utilizar en la generación de esquemas.
Entonces, creo que esta oración explica el caso de uso real de Basic (opcional) que se usa en la generación de esquemas. (Es decir: cuando genera CREATE TABLE SQL a partir de clases de entidad Java. Esto es algo que Hibernate puede hacer, por ejemplo).
optional = false
es solo para verificar esta restricción en tiempo de ejecución. nullable = false
crea restricción de base de datos. Para las aplicaciones, establecer también optional = false
tiene sentido, porque se evalúa más rápido que ir a la base de datos y verificar esa restricción allí ..