Подтвердить что ты не робот

Почему @OneToOne позволяет дублировать ассоциации?

У меня есть классы пользователя и адреса следующим образом:

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". right?

-Siva

4b9b3361

Ответ 1

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

В базе данных выполняется фактическая полицейская операция "один-к-одному" - нам нужна схема с ограничениями уникальности. @JoinColumn выражает, как это отношение проявляется в DatabaseSchema.Это может быть полезно, если мы генерируем схему.

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

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

Ответ 2

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

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