que tienen clases de usuario y la dirección de la siguiente manera:¿Por qué @OneToOne está permitiendo asociaciones duplicadas?
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 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 varios 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 direcciones con addr_id = 1 y la inserción de registro de un usuario en la tabla de usuario con addr_id = 1. Multa.
Una vez más,
User u2 = new User();
//set data
Address addr1 = (Address) session.load(Address.class, 1);
//set data
u2.setAddress(addr1);
...
session.save(u2);
-> Esto está creando segundo registro de usuario y asociar a la dirección existente con addr_id = 1, que no se desea.
Puedo usar @OneToOne (..) @ JoinColumn (name = "addr_id", unique = true) para evitar esto. Pero cuál será la diferencia de usar @OneToOne en lugar de @ManyToOne (.., unique = true).
@OneToOne en sí debería imponer la condición "único = verdadero" ... ¿correcto?
-Siva
Me enfrenté al mismo problema. 'OneToOne' debe ser renombrado a' OneToOneOnEntityLevel'. Del mismo modo 'JpaRepository.save()' debe ser 'jpaRepository.saveOrMerge()'. Estas dos cosas pueden conducir a la corrupción de datos a nivel de base de datos. –