2011-11-25 19 views
14

He tropezado con este ejemplo en JPA 2.0 FR Specification, 11.1.37. OneToOne anotación, página 403:@OneToOne (opcional = falso) y @JoinColumn (nullable = false) usados ​​juntos

@OneToOne(optional=false) 
@JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false) 
public CustomerRecord getCustomerRecord() { return customerRecord; } 

¿Hay alguna razón por la que debo poner @OneToOne(optional=false) y en ese mismo tiempo puso @JoinColumn(... nullable=false)?

¿No son estas dos declaraciones lo mismo? ¿No es uno de ellos redundante?
¿Se usan ambos en la generación de esquema DDL?

Respuesta

26

Formalmente optional=false es una instrucción de tiempo de ejecución para la implementación de JPA, y nullable=false es una instrucción para el generador DDL. Entonces no son estrictamente redundantes.

La diferencia puede volverse significativa cuando hay herencia de entidad involucrada. Si un mapeo particular existe solo en una subclase, y usted tiene una tabla de tabla única por estrategia de jerarquía, entonces el mapeo OneToOne puede ser optional=false en la subclase particular que contiene el mapeo. Sin embargo, la columna de unión real no puede hacerse no nula, ¡ya que no se pueden insertar otras subclases que compartan la tabla!

En la práctica, diferentes versiones de diferentes proveedores pueden o no interpretar cualquiera en cualquier momento, caveat emptor.

+4

¡Muy agradecido por una respuesta tan clara! –

Cuestiones relacionadas