我正在学习Spring,但我无法了解如何在Spring JPA中映射两个模型。我能够通过ID加入表格。默认情况下,它链接user.id.我想链接user.userName。怎么改呢? 我的用户模型:
@Entity
@Table(name = "user")
public class SiteUser {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "username", unique = true, length = 30)
private String userName;
@Column(name = "email", unique = true, length = 60)
private String email;
@Column(name = "password", length = 60)
private String password;
@Column(name = "role", length = 15)
private String role;
@Column(name = "fullname", length = 60)
private String fullName;
@Column(name = "age", length = 3)
private int age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
我的个人资料模型:
@Entity
@Table(name="profile")
public class Profile {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private Long id;
@OneToOne(targetEntity=SiteUser.class)
@JoinColumn(name="user_id", nullable=false)
private SiteUser user;
@Column(name="about", length=5000)
private String about;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public SiteUser getUser() {
return user;
}
public void setUser(SiteUser user) {
this.user = user;
}
public void safeCopyFrom(Profile other){
if(other.about !=null){
this.about = other.about;
}
}
}
答案 0 :(得分:0)
SiteUser.java
:
public class SiteUser {
// ...
@OneToOne(mappedBy="user")
private Profile userProfile;
// ...
}
Profile.java
:
public class Profile {
// ...
@OneToOne
@JoinColumn(name=/* username column name in table "profile" */)
private SiteUser user;
// ...
}
注意:表profile
必须有用户名列,否则您将无法通过用户名链接这两个实体。另请注意,在这种情况下,关系的owning side为Profile
,这是违反直觉的。用户通常会设置和管理他的个人资料,而不是相反。
答案 1 :(得分:0)
您在两个entite之间使用双向@OneToOne关系,并且您放置@JoinColumn的位置表示关系的所有者方面,在您的情况下,您将它放在Profile类上。 这是关于两个实体之间关系的伟大文章,正如它提到的那样
JPA中的连接列是所有者实体中的一列,它引用非所有者或反向实体中的密钥(通常是主键)。阅读上面这一行后首先想到的是JoinColumns只不过是一个外键列。情况确实如此。 JPA将它们称为Join Columns,可能是因为它们在实际角色中更加冗长,使用公共列加入这两个实体。
因此,您要在Profile类上定义Foreing Key列 Foreing Key Column的规则是它应该指向目标实体中的主键或唯一列,你应该在你的senario上使用它?
public class Profile {
@OneToOne
@JoinColumn(name="username")
private SiteUser user;
}