Почему @OneToOne позволяет дублировать ассоциации? - PullRequest
19 голосов
/ 23 января 2012

У меня есть классы 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

Ответы [ 2 ]

6 голосов
/ 23 января 2012

@ OneToOne аннотирует Java, чтобы выразить идею взаимосвязи между двумя классами. Если бы это была @OneToMany, у нас была бы коллекция. Таким образом, читая аннотации, мы понимаем реальные корабли, и среда выполнения JPA также понимает их.

Фактическая политика «один-к-одному» выполняется в базе данных - нам нужна схема, чтобы иметь ограничения уникальности. @JoinColumn выражает, как эта связь проявляется в DatabaseSchema. Это может быть полезно, если мы генерируем схему.

Однако во многих случаях мы используем восходящие инструменты для генерации Java из схемы. В этом случае нет необходимости в том, чтобы аннотации Java отражали ограничения базы данных, с точки зрения Java мы просто видим взаимосвязь.

Интеллектуальный компилятор может предупредить нас, если семантика нашего @JoinColumn не соответствует @oneToOne, но я не уверен, что нынешние реализации делают это.

4 голосов
/ 23 января 2012

OneToOne - аннотация, описывающая объектную модель.Это говорит о том, какова мощность ассоциации.unique="true" указывает инструменту «модель-на-ddl», что в этом столбце должен быть уникальный указатель.Вы можете использовать такой инструмент, но вы также можете самостоятельно создавать и поддерживать схему базы данных.

Что бы вы ни выбрали, движок JPA не выполняет запрос каждый раз, когда изменяется связь OneToOne, чтобы проверить, соблюдается ли количество элементов.Все, что он делает, предполагает, что код правильный, и уникальное ограничение в базе данных обеспечит соблюдение мощности.

...