所以我正在从这些简单的示例中学习,有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 ?
感谢您的帮助!
答案 0 :(得分:1)
第二季度:相同的示例将映射到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);
您只需要保存父项。这也将拯救孩子。