Java Spring JPA如何通过userName将我的User模型映射到Profile模型?

时间:2016-10-29 16:37:13

标签: java spring jpa

我正在学习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;
    }

}

}

2 个答案:

答案 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 sideProfile,这是违反直觉的。用户通常会设置和管理他的个人资料,而不是相反。

答案 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;
}