Hibernate: ¿por qué usar many-to-one para representar uno a uno?

He visto a personas usar asignaciones de muchos a uno para representar relaciones uno a uno. También lo leí en un libro de Gavin King y en artículos.

Por ejemplo, si un cliente puede tener exactamente una dirección de envío y una dirección de envío puede pertenecer a un solo cliente, la asignación se da como sigue:

 ...  ...  

El libro razona como (citando):

“No le importa lo que está en el lado de destino de la asociación, por lo que puede tratarlo como una asociación uno sin muchas partes”.

Mi pregunta es, ¿por qué usar many-to-one y no one-to-one ? ¿Qué se trata de one-to-one que lo hace una opción menos deseable para many-to-one ?

Gracias.

Hay varias formas de implementar una asociación uno a uno en una base de datos: puede compartir una clave principal pero también puede usar una relación de clave externa con una restricción única (una tabla tiene una columna de clave externa que hace referencia a la clave primaria de la tabla asociada).

En el caso posterior, la forma de hibernate para mapear esto es usar una asociación many-to-one (que permite especificar la clave externa).

La razón es simple: no le importa lo que está en el lado de destino de la asociación, por lo que puede tratarlo como una asociación uno sin muchas partes. Todo lo que quiere es express “Esta entidad tiene una propiedad que es una referencia a una instancia de otra entidad” y usar un campo de clave externa para representar esa relación.

En otras palabras, la forma de asignar asociaciones de claves foráneas individuales (que en realidad son tal vez más frecuentes que las asociaciones individuales de clave primaria compartidas) es many-to-one forma de asignar many-to-one .

La mayor diferencia es que, con un mapeo uno a uno de clave compartida, los 2 objetos están unidos entre sí, existen juntos.

si crea una clase Person y una clase Address que estén vinculadas a tablas con el mismo nombre, cada persona tendrá exactamente una dirección …

  • clase Persona -> propiedades: dirección
  • tabla Persona -> columnas: id, nombre
  • tabla Dirección -> columnas: id, ciudad

Con una relación muchos a uno , la estructura de la tabla cambia un poco, pero se puede lograr el mismo efecto …

  • clase Persona -> propiedades: dirección
  • tabla Persona -> columnas: id, nombre, direcciónid (fk)
  • tabla Dirección -> columnas: id, ciudad

… pero aún más. Ahora esta persona puede tener múltiples direcciones:

  • clase Persona -> propiedades: dirección
  • table Person -> columns: id, name, addressid (fk), shippingaddressid (fk)
  • tabla Dirección -> columnas: id, ciudad

Las dos claves externas (addressid y shippingaddressid) podrían apuntar a una sola entrada de DB … o una única dirección podría pertenecer a 2-3 personas. Entonces, ¿cuál es el concepto de muchos a uno del lado de la persona? es uno a muchos desde el lado de la dirección.

y solo adivina qué aspecto tiene una asociación uno a muchos con solo 1 elemento. Sí, solo como uno a uno …

NOTA: la dirección en realidad debería ser un objeto de valor , no debería ser compartida en DB (por lo que es un ejemplo tonto, pero supongo que va a estar bien)

En resumen:

  1. en quirófano mapeo uno a uno es más difícil de manejar
  2. uno a uno tiene sus limitaciones
  3. usar muchos a uno en su lugar es más flexible y lo mismo se puede lograr con

Yo diría que el problema está fundamentalmente relacionado con el desajuste de la impedancia relacional del objeto. Para poder relacionar las dos representaciones de objeto en una base de datos, necesita tener algún tipo de relación entre sus tablas. Sin embargo, la base de datos solo conoce la relación 1: N: todos los demás se derivan de ella.

Con las bases de datos relacionales y los lenguajes de objetos, le corresponde al desarrollador encontrar la representación menos artificial del concepto que quiere representar (en este caso, una relación 1: 1).

Incluso está en los documentos oficiales de Hibernate: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/associations.html#assoc-bidirectional-121 .

No es totalmente irrazonable. El extremo de muchos a uno dice: estoy mapeado a través de una de mis columnas a una ID del -un extremo. Utilizaría exactamente el mismo esquema de base de datos para muchos a uno.

Según tengo entendido, hibernate requiere que la clave principal de ambos objetos coincida en una relación de 1 a 1. Muchos a 1 evita ese requisito.

Sin embargo, muchos a 1 pierden la información de que solo debe haber uno o quizás ningún objeto en los muchos lados.