Java Hibernate OneToOne: какая сторона должна быть владельцем - PullRequest
0 голосов
/ 05 апреля 2019

Итак, я учусь на этих простых примерах, есть 2 таблицы: USERS и USER_DETAILS, достаточно простые, у каждого пользователя есть user_details и отношение 1: 1. Итак, этот пример такой,

@Entity
@Table(name = "USERS")
public class User {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "USR_ID")
   private long id;

   @Column(name = "USERNAME", nullable = false, unique = true)
   private String username;

   @Column(name = "PASSWORD")
   private String password;

   @OneToOne(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY)
   private UserDetail userDetail;

   //Setter and getter methods
}

@Entity
@Table(name = "USER_DETAILS")
public class UserDetail {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "USR_DET_ID")
   private long id;

   @Column(name = "FIRST_NAME")
   private String firstName;

   @Column(name = "LAST_NAME")
   private String lastName;

   @Column(name = "EMAIL")
   private String email;

   @Column(name = "DBO")
   private LocalDate dob;

   @OneToOne(fetch=FetchType.LAZY)
   @JoinColumn(name = "USR_ID")
   private User user;

   //Setter and Getter methods
}

Если вы посмотрите на mappedBy, то это пользователь, а не пользователь.

Q1: so USER is the owner, if it calls save(), 
USER_DETAILS table will be updated as well ?

Q2: same examples put mappedBy in the USER_DETAILS side,
why people want to do this ?
How to determine which side to put mappedBy ? 

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 05 апреля 2019

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);

Вам нужно только сохранить родителя.Это спасет и ребенка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...