Есть две сущности: User и Address. Они в моем случае должны быть связаны связью один-к-одному, то есть в одной из них должна быть ссылка на другую: либо в классе User должно быть поле Address address, к которому мы пишем @JoinColumn, а со стороны адреса делаем mappedBy, либо же в классе Address поле User user и проделываем то же самое. Так вот, как именно определить, какая сущность при односторонней связи является как бы явно зависимой от другой, а какая не должна знать о своей связи с ней?
Вы пишите:
Они в моем случае должны быть связаны связью один-к-одному, то есть в одной из них должна быть ссылка на другую
, а затем:
либо в классе 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".
Обе таблицы должны иметь поля для ссылок друг на друга, если заранее неизвестно за какой конец этого relation будут дергать БД.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости