2012-01-19 12 views
20

Tengo un modelo simple con un objeto Question y Choice.¿Qué significa el propietario de la relación en una relación bidireccional?

  • Una pregunta tiene MANY CHOICE (S).
  • muchas opciones tiene una pregunta

Hay dos maneras de implementar que con Hibernate

Implementación Uno: El lado es propietario elección

Question.java

@OneToMany (mappedBy="question") 
private Set choices = new HashSet(); 

Choice.java

@ManyToOne 
@JoinColumn (name="QUESTION_ID") 
private Question question; 

Implementación Dos: El lado es propietario Pregunta

Question.java

@OneToMany 
@JoinColumn (name = "QUESTION_ID") 
private Set choices = new HashSet(); 

Choice.java

@ManyToOne 
@JoinColumn (name="QUESTION_ID", updatable = false, insertable = false) 
private Question question; 

¿Cuál es la diferencia entre los dos implementación?

+4

Demuestre que estoy equivocado, pero creo que cambiar el lado no propietario no se refleja automáticamente en la base de datos (usando la comprobación sucia), mientras que modificar el lado propietario sin modificar el otro * es *. Tenga en cuenta que en este caso el lado * many- * es la opción natural para el propietario, ya que tiene una clave externa en el nivel de la base de datos. –

+0

¿No olvidó poner el argumento tipo en el conjunto de opciones? E.G: Establecer choises. Si no lo usas, ¿cómo hibernate puede determinar dónde (qué clase?) Para encontrar el atributo "pregunta" al que te refieres en la anotación mapeada ... o hibernate es consciente de eso de alguna manera ... o no lo hago. Sé cómo funciona esto detrás de las cortinas. – Victor

Respuesta

14

Su primer ejemplo es el mapeo bidireccional normal de uno a muchos/varios a uno. El establecimiento de Question a Choice -tributo ("lado propietario") es suficiente para que la relación persista. El gráfico de la entidad en la memoria se mezclará hasta que se vuelva a leer el otro lado de la relación de la base de datos. Desde el , el propietario del punto de vista de la base de datos es la entidad que persiste en la tabla que tiene una columna de clave externa (lo mismo para bidireccional de uno a uno). En la memoria de esto se explica siguiente manera:

El muchos lado de uno-a-muchos/muchos-a-uno relaciones bidireccionales debe ser el lado propietario, por lo tanto, el elemento de mappedBy no puede ser especifica en la anotación ManyToOne .
....
Bidireccional las relaciones entre las entidades administradas se mantendrán basadas en referencias mantenidas por el lado propietario de la relación. Es responsabilidad del desarrollador de mantener las referencias en memoria retenidas en del lado propietario y las del lado inverso coherentes con cuando cambian. En el caso de one-to-one unidireccional y relaciones de uno a muchos, es responsabilidad del desarrollador asegurarse de que se respete la semántica de las relaciones.

En términos JPA su segundo ejemplo no tiene lado propietario, debido a la ausencia de mappedBy. En su lugar, tiene dos relaciones unidireccionales que están obligadas a usar la misma columna como tienda. Al menos con Hibernate 3.5.6 se comportará siguiente manera:

  • Configuración Question a choice -attribute no persistirá relación.
  • Añadiendo Choice a question -tributo no persistirá.
  • Para persistir el valor a "QUESTION_ID" ambos tienen que configurarse (sí, también no- insertablequestion).
Cuestiones relacionadas