Как определить какая сущность должна содержать ссылку на другую в БД

159
16 ноября 2021, 07:30

Есть две сущности: User и Address. Они в моем случае должны быть связаны связью один-к-одному, то есть в одной из них должна быть ссылка на другую: либо в классе User должно быть поле Address address, к которому мы пишем @JoinColumn, а со стороны адреса делаем mappedBy, либо же в классе Address поле User user и проделываем то же самое. Так вот, как именно определить, какая сущность при односторонней связи является как бы явно зависимой от другой, а какая не должна знать о своей связи с ней?

Answer 1

Вы пишите:

Они в моем случае должны быть связаны связью один-к-одному, то есть в одной из них должна быть ссылка на другую

, а затем:

либо в классе User должно быть поле Address address, к которому мы пишем @JoinColumn, а со стороны адреса делаем mappedBy

Это уже двунаправленное отображение (bidirectional).

Так вот, как именно определить, какая сущность при односторонней связи является как бы явно зависимой от другой, а какая не должна знать о своей связи с ней?

Возможный способ отображения связи один-к-одному с помощью внешнего ключа:

Address:

@Entity
class Address { /* impl */ }

User:

@Entity
class User
{
    @OneToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.PERSIST)
    @JoinColumn(unique = true)
    protected Address homeAddress;
}

Разумеется, это не полное определение классов-сущностей, я указал только важные в данном контексте детали.

Пример использования:

var user = new User("...");
var addr = new Address("...");
user.setHomeAddress(addr);
em.persist(user);

Сохранение addr произошло транзитивно при сохрании user.

Так вот, при одностороннем отображении мы не "трогаем" вторую сущность (заметьте отсутствие аннотаций в классе Address), соответственно не возникает вопроса, вроде, "где писать mappedBy".

Answer 2

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

READ ALSO
Можно ли заполнить массив с помощью foreach

Можно ли заполнить массив с помощью foreach

Можно ли заполнить массив с клавиатуры с помощью foreach? Суть какая: создаю список и хочу заполнить данными с клавиатуры, пока не введу "стоп-слово"

192
Доработка кода массива

Доработка кода массива

Вечер добрый, простите за тупость, в java меньше 3-х недель и немного не понимаю как добавить переменную в код, чтобы сортировка была именно на столько...

116
jsf обработать кнопку

jsf обработать кнопку

Не погу понять, как сделать,чтобы при нажатии кнопки create pet можно было создать Pet

293
Взаимодействие C# и Java

Взаимодействие C# и Java

Мне нужно реализовать сетевое взаимодействие приложений на Android (Java) и Windows (C#)Я испытываю трудности с написанием серилизатора на разных языках...

233