Q2: те же примеры помещают mappedBy в сторону USER_DETAILS, почему люди хотят это делать?Как определить, с какой стороны ставить mappedBy?
В двунаправленном отношении каждый объект имеет поле отношения или свойство, которое относится к другому объекту.Через поле или свойство отношения код класса сущности может получить доступ к связанному объекту.Если у сущности есть связанное поле, говорят, что сущность «знает» о своем родственном объекте.
В вашем примере существует двунаправленное отношение один к одному.Обе сущности User
и UserDetail
имеют поле отношений.@OneToOne
аннотация, указанная для обеих сущностей.
Для двунаправленных отношений «один к одному» сторона-владелец соответствует стороне, содержащей соответствующий внешний ключ.
Владелец отношения - UserDetail
юридическое лицо.Владелец имеет аннотацию @JoinColumn
для указания внешнего ключа (USR_ID
).
Обратная сторона отношения (User
) имеет атрибут mappedBy
.
Q1: таким образом, USER является владельцем, если он вызывает save (), таблица USER_DETAILS также будет обновлена?
В вашем примере UserDetail
является владельцем,Поэтому процесс сохранения:
User user = new User(); // Ignoring the constructor parameters...
UserDetail userDetail = new UserDetail();
user.setUserDetail(userDetail);
userDetail.setUser(user);
userRepository.save(user);
Вам нужно только сохранить родителя.Это спасет и ребенка.