У меня есть классы User и Address следующим образом:
class User
{
...
...
@OneToOne( cascade=CascadeType.ALL)
@JoinColumn(name="addr_id")
private Address address;
}
class Address
{
...
...
@OneToOne(mappedBy="address")
private User user;
}
Здесь я предполагаю, что с этой моделью домена я могу связать один адрес только с одним пользователем (user.addr_id должен быть уникальным).
Но с этой моделью домена я могу создать несколько пользователей и связать их с одним и тем же адресом.
User u1 = new User();
//set data
Address addr1 = new Address();
//set data
u1.setAddress(addr1);
...
session.save(u1);
-> это создает одну запись адреса с addr_id = 1 и вставляет одного пользователязапись в пользовательской таблице с addr_id = 1.Хорошо.
Опять же,
User u2 = new User();
//set data
Address addr1 = (Address) session.load(Address.class, 1);
//set data
u2.setAddress(addr1);
...
session.save(u2);
-> Это создает вторую запись пользователя и связывает ее с существующим адресом с addr_id = 1, что нежелательно.
Iможно использовать @OneToOne (..) @ JoinColumn (name = "addr_id", unique = true), чтобы предотвратить это.Но в чем будет разница с использованием @OneToOne вместо @ManyToOne (.., unique = true).
@ Сам OneToOne должен навязывать условие "unique = true "..правда?
-Siva