2010-05-24 16 views

Respuesta

81

Gordon Yorke (EclipseLink Comité de Arquitectura miembros, TopLink núcleo de plomo técnico, JPA 2.0 Grupo de Expertos Miembro) escribió una buena respuesta sobre este tema así que en vez de él parafraseando, voy a citar his answer:

La diferencia entre optional y nullable es el alcance en el que se evalúan . La definición de 'optional' se refiere a la propiedad y los valores de campo y sugiere que esta característica se debe evaluar dentro del tiempo de ejecución . 'nullable' está solo en referencia a las columnas de la base de datos.

Si una aplicación elige a aplicar optional entonces esos propiedades deben ser evaluados en memoria por el proveedor de persistencia y una excepción planteada antes de que SQL se envía a la base de datos de otro modo cuando se utiliza 'updatable=false' 'optional' las violaciones nunca serían reportadas.

+6

Entonces, ¿cuál debería ser realmente usado, tal vez ambos? –

+32

@Xie Jilei: Del libro: Persistencia de Java con Hibernate 2007, p. 179: '@Basic (opcional = falso) @Column (nullable = false)' La anotación @Basic marca la propiedad como no opcional en el nivel del objeto Java. La segunda configuración, nullable = false en la asignación de columnas, es solo responsable de la generación de una restricción de base de datos NOT NULL. La implementación Hibernate JPA trata ambas opciones de la misma manera en cualquier caso, por lo que puede usar para usar solo una de las anotaciones para este propósito. – rapt

+2

@rapt - No entiendo 'La anotación @Basic marca la propiedad como no opcional en el nivel de objeto Java. ¿Qué significa eso? Entonces, solo '@ Basic' es como decir que la columna de la base de datos' NOT NULL' para dicha variable? –

1

Así que probé el (opcional = false) anotación @Basic usando JPA 2.1 (EclipseLink) y resulta que la anotación se ignora en el uso real (por lo menos para un campo de cadena). (por ejemplo, llamadas a entityManager.persist).

Así que fui a la especificación y leí sobre ella. Esto es lo que la especificación tiene que decir:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

básico (opcional): Si el valor del campo o propiedad puede ser nulo. Esta es una sugerencia y no se tiene en cuenta para los tipos primitivos ; se puede usar en la generación de esquema.

Creo que esta oración explica el caso de uso real para Basic (opcional) que se utiliza en la generación de esquema. (Es decir: cuando genera CREATE TABLE SQL desde clases de Entidad Java. Esto es algo que Hibernate puede hacer, por ejemplo.)

Cuestiones relacionadas