unidirectional onetomany one mapsid manytomany many ejemplo data jpa one-to-one

mapsid - onetomany jpa ejemplo



¿Por qué @OneToOne está permitiendo asociaciones duplicadas? (2)

@OneToOne anota el Java para expresar la idea de la relación entre las dos clases. Si esto fuera un @OneToMany, tendríamos una colección en su lugar. Entonces, al leer las anotaciones comprendemos las relaciones reales, y el tiempo de ejecución de JPA también las comprende.

La vigilancia real del uno-a-uno se realiza en la base de datos; necesitamos que el esquema tenga las restricciones de exclusividad. El @JoinColumn expresa cómo esa relación se manifiesta en DatabaseSchema. Esto puede ser útil si estamos generando el esquema.

Sin embargo, en muchos casos, utilizamos herramientas ascendentes para generar Java a partir del esquema. En este caso, no existe una necesidad real de que las anotaciones de Java reflejen las restricciones de la base de datos, desde una perspectiva de Java, simplemente vemos la relación.

Un compilador inteligente podría advertirnos si la semántica de @JoinColumn no coincide con @oneToOne, pero no estoy seguro de si las implementaciones actuales lo hacen.

Tengo las clases de Usuario y Dirección de la siguiente manera:

class User { ... ... @OneToOne( cascade=CascadeType.ALL) @JoinColumn(name="addr_id") private Address address; } class Address { ... ... @OneToOne(mappedBy="address") private User user; }

Aquí mi suposición es que con este modelo de dominio puedo asociar una dirección a un solo usuario (user.addr_id debe ser único).

Pero con este modelo de dominio, puedo crear múltiples usuarios y asociarlos a la misma dirección.

User u1 = new User(); //set data Address addr1 = new Address(); //set data u1.setAddress(addr1); ... session.save(u1);

-> esto está creando un registro de dirección con addr_id = 1 e insertando un registro de usuario en la tabla de usuario con addr_id = 1. Multa.

De nuevo,

User u2 = new User(); //set data Address addr1 = (Address) session.load(Address.class, 1); //set data u2.setAddress(addr1); ... session.save(u2);

-> Esto crea un segundo registro de usuario y se asocia a una dirección existente con addr_id = 1, que no es deseable.

Puedo usar @OneToOne (..) @ JoinColumn (name = "addr_id", unique = true) para evitar esto. Pero cuál será la diferencia entre usar @OneToOne en lugar de @ManyToOne (.., unique = true).

@OneToOne en sí debería imponer condiciones "únicas = verdaderas" ... ¿correcto?

-Siva


OneToOne es una anotación que describe el modelo de objetos. Dice cuál es la cardinalidad de la asociación. unique="true" es una indicación para la herramienta "model-to-ddl" de que debe haber una restricción única en esta columna. Puede utilizar dicha herramienta, pero también puede crear y mantener el esquema de la base de datos usted mismo.

Independientemente de lo que elija hacer, el motor de JPA no realiza una consulta cada vez que se modifica la asociación OneToOne para verificar que se respete la cardinalidad. Todo lo que hace es suponer que el código es correcto, y la restricción única en la base de datos se asegurará de que se respete la cardinalidad.