2009-08-20 12 views
30

En este documento (desplácese hacia abajo a la sección unidireccional):Hibernate unidireccional de una a muchas asociaciones: ¿por qué es mejor una tabla de unión?

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-association-collections

se dice que una asociación unidireccional uno-a-muchos de ellos con una tabla de unión es mucho más preferible a simplemente usando una columna de clave externa de la entidad de propiedad Mi pregunta es, ¿por qué es tan preferido?

+0

ver http://stackoverflow.com/questions/2092611/why-is-it-recommended-to-avoid-unidirectional-one-to-many-association-on-a-forei –

Respuesta

36

Considere la situación en la que el tipo de entidad propiedad también puede ser propiedad de otro tipo de entidad principal. ¿Ponen referencias de clave foránea en la tabla propia a ambas tablas padre? ¿Qué pasa si tienes tres tipos de padres? Simplemente no se adapta a diseños grandes.

Una tabla de unión desacopla la unión, de modo que la tabla propiedad no tiene conocimiento de la tabla principal, permitiendo que el diseño se escale elegantemente.

+1

ver la diferencia de las operaciones internas de SQL que se invocan en la tabla de unión y la clave externa en http://stackoverflow.com/q/18333198/418439 –

11

Si la entidad hija solo tiene un solo tipo principal, entonces no hay necesidad de una tabla join. He hecho esto con JPA (con una impl de hibernación).

Ventajas: Una tabla menos. Tal vez un mejor rendimiento. No "¿para qué sirve esta tabla?" escribe preguntas.

Desventaja: Desde la perspectiva OO hay una dependencia adicional entre el niño y el padre introducido. En la práctica, esto probablemente no sea tan importante, ya que la relación es privada en el niño.

 
e.g. 
parent: 
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) 
@MapKey(name = "name") 
private Map children; 

child: 
@ManyToOne(optional = false) 
private Parent parent; 
+0

puede obtener más información sobre la desventaja –

+0

Desventaja refinada. – Conor

+0

Simplemente tenga en cuenta que con JPA 2.0 ya no es necesaria la referencia en el hijo del padre. Simplemente use la anotación @JoinColumn en el padre. –

Cuestiones relacionadas