Почему @OneToOne разрешает повторяющиеся ассоциации?

У меня есть следующие классы 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, что нежелательно.

Я могу использовать @OneToOne (..) @ JoinColumn (name = "addr_id", unique = true), чтобы предотвратить это. Но в чем разница использования @OneToOne вместо @ManyToOne (.., unique = true).

@OneToOne сам должен устанавливать условие "unique = true" .. верно?

-Siva

19
задан K. Siva Prasad Reddy 23 January 2012 в 07:20
поделиться