Вла*_*нов 2 java persistence hibernate hibernate-mapping
我有一个复合主键表由两列组成,该表也有一个唯一键.另一个表中的唯一键被映射为外键.如何用Hibernate实现这个映射?我为复合主键创建一个@Embedable类,在实体中我使用注释@EmbeddedId.在第二个表中,我声明了一个字段:
@ManyToOne
@JoinColumn(name = "user_code", nullable = false)
public User userCode;
Run Code Online (Sandbox Code Playgroud)
这是第一个表中的唯一键,但我得到一个例外:从com.users.maintenance.Code引用com.users.maintenance.User的外键具有错误的列数.应该是2.
编辑 这是我的用户类:
@Entity
@Table(name = "Users")
public class User {
@EmbeddedId
public UserPk userId;
@column(name = "code")
public int code;
public UserPk getUserId() {
return this.userId;
}
public void setUserId(UserPk userId) {
this.userId = userId;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
@Embeddable
private class UserPk implements Seriazible {
@Column(name = "user_name")
public String userName;
@Column(name = "email")
public String email;
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public int hashCode() {
return this.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof UserPk)) {
return false;
}
UserPk pk = (UserPk)obj;
return pk.userName == userName && pk.email == email;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你需要告诉Hibernate User你指的是哪些列(如果它不是主键).为此,请添加referencedColumnName第二个实体:
@ManyToOne
@JoinColumn(name = "user_code", nullable = false, referencedColumnName = "code")
public User userCode;
Run Code Online (Sandbox Code Playgroud)
我没有检查过,但也许您还需要指定该code列在User类中是唯一的:
public class User {
...
@Column(name = "code", unique=true)
public int code;
...
Run Code Online (Sandbox Code Playgroud)
正如旁注:不要公开所有字段,正确使用封装.
| 归档时间: |
|
| 查看次数: |
2738 次 |
| 最近记录: |