Aunque mi pregunta está expresada específicamente sobre la forma en que se representan las relaciones Entity en el marco Play, que utiliza Hibernate, estoy seguro de que esto es general concepto.Intentando comprender la importancia del lado propietario de una relación uno-muchos en ORM
Cuando tenemos una relación de uno a muchos, siempre se nos pide que especifiquemos el lado propietario.
Entonces, por ejemplo, si tuviéramos una relación uno a muchos entre Persona y Número de teléfono, escribiríamos un código como este.
@Entity
class Person {
@OneToMany(mappedBy="person")
public Set<PhoneNumber> phoneNumbers;
}
@Entity
class PhoneNumber {
@ManyToOne
public Person person;
}
En el código anterior, la entidad propietaria es PhoneNumber. ¿Cuáles son los pros y los contras de que cada lado sea la entidad propietaria?
Me doy cuenta cuando la entidad propietaria es PhoneNUmber, la relación representada es ManyToOne, que no dará como resultado una tabla de unión, mientras que cuando el lado propietario es Person, la relación representada sería OneToMany, en cuyo caso una tabla de relación ser creado.
¿Es esta la razón principal para determinar el lado propietario, o hay otras razones también?
Actualización: me di cuenta de que this thread proporciona parte de la respuesta, pero estoy esperando que puede haber otros puntos también.
Estoy tratando de pensar en voz alta. Digamos que en ambos casos, hacemos una búsqueda ansiosa. Para el primer caso, donde PhoneNumber es la entidad propietaria, activaremos la primera consulta para obtener todas las entidades Persona, y luego activaremos consultas individuales para que cada Persona obtenga todos los PhoneNumber para esa Persona. Sin embargo, si tuviéramos a la Persona como el lado propietario, necesitamos disparar solo una consulta con una combinación. Lo siento si esta es una pregunta tonta, pero ¿no es posible una unión con Person siendo un FK en PhoneNumber? – Parag
Sí, la unión debería ser posible con la identificación de persona FK en la tabla del teléfono también.Aquí estoy (asumiendo) que una búsqueda normalizada sería más rápida, pero debes mirar tu plan de explicación para estar seguro. Otra razón (al menos teórica) para utilizar una tabla de relaciones sería permitir el uso compartido de números de teléfono, como un número de teléfono utilizado por dos personas por turnos. Francamente, cómo funciona una capa de ORM no debe ser relevante para tales consideraciones porque nadie diseña el esquema con una capa de ORM en mente – rjha94
vea mi respuesta en este hilo también por razones de los nombres 'mappedBy' y 'owning side', lo que sucede si no definimos un lado propietario, GOTCHAs - http://stackoverflow.com/questions/2749689/what-is-the-owning-side-in-an-orm-mapping/21068644#21068644 –