Java休眠OneToOne:哪一方应为所有者

时间:2019-04-05 15:01:36

标签: java hibernate

所以我正在从这些简单的示例中学习,有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
}

如果您查看mappingBy,它位于用户而非UserDetails中。

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 个答案:

答案 0 :(得分:1)

第二季度:相同的示例将映射到USER_DETAILS一侧, 人们为什么要这样做? 如何确定放置mappedBy的哪一侧?

  

在双向关系中,每个实体都有一个关系字段   或引用其他实体的财产。通过关系   字段或属性,实体类的代码可以访问其相关内容   宾语。如果实体具有相关字段,则该实体被称为“知道”   关于它的相关对象。

您的示例中存在一对一的双向关系。 UserUserDetail实体都有一个关系字段。在两个实体上都指定了@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);

您只需要保存父项。这也将拯救孩子。