Hibernate联合主键注解方式,即是Hibernate中某一张表出现多个字段联合为唯一主键的情况。这时候就可以使用Hibernate的联合主键来操作。以用户表为例子,userId+userName为唯一主键,因为有时候会出现多个用户的姓名是一样的,如果加上userId就可以控制唯一,判断是否是同一个用户。
注:主键类(UserPK类)是指只有userId和userName的联合字段的类,即是多个字段联合为主键的类==联合主键类。User类是指用户表的实体类。
方式一
主键类(UserPK类):该类实现java.io.Serializable接口,并重写 equals 和 hascode,再将该类注解为@Embeddable。
实体类(User类):该类不包含主键类中的字段,但是需要保存联合主键类的引用,并且生成set和get方法, 并将该引用注解为 @Id 。实体类注解为@Entity和@Table。
实体类:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/**
* @author: ZHJ
* @date:Created in 11:15 2020/3/16
* @modify By:
* @description :User的实体类
*/
@Entity
@Table(name = "user")
public class User implements Serializable {
private Integer age;
private String email;
private Date birthday;
@Id
private UserPK userPK;//联合主键类
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public UserPK getUserPK() {
return userPK;
}
public void setUserPK(UserPK userPK) {
this.userPK = userPK;
}
}
主键类:
import javax.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;
/**
* @author: ZHJ
* @date:Created in 11:21 2020/3/16
* @modify By:
* @description :User的联合主键类
*/
@Embeddable
public class UserPK implements Serializable{
private Integer userId;
private String userName;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
//重写hashCode
@Override
public int hashCode() {
return Objects.hash(this.userId,this.userName);
}
//重写equal
@Override
public boolean equals(Object obj) {
if(obj instanceof UserPK){
UserPK key = (UserPK)obj;
if(this.userId.equals(key.getUserId()) && this.userName.equals(key.getUserName())){
return true;
}
}
return false;
}
}
方式二
主键类(UserPK类):该类实现java.io.Serializable接口,并重写 equals 和 hascode,不需要注解@Embeddable。
实体类(User类):该类不包含主键类中的字段,但是需要保存联合主键类的引用,并且生成set和get方法, 并将该引用注解为 @EmbeddedId 。实体类注解为@Entity和@Table。
实体类:
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/**
* @author: ZHJ
* @date:Created in 11:15 2020/3/16
* @modify By:
* @description :User的实体类
*/
@Entity
@Table(name = "user")
public class User implements Serializable {
private Integer age;
private String email;
private Date birthday;
@EmbeddedId
private UserPK userPK;//联合主键类
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public UserPK getUserPK() {
return userPK;
}
public void setUserPK(UserPK userPK) {
this.userPK = userPK;
}
}
主键类:
import java.io.Serializable;
import java.util.Objects;
/**
* @author: ZHJ
* @date:Created in 11:21 2020/3/16
* @modify By:
* @description :User的联合主键类
*/
public class UserPK implements Serializable{
private Integer userId;
private String userName;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
//重写hashCode
@Override
public int hashCode() {
return Objects.hash(this.userId,this.userName);
}
//重写equal
@Override
public boolean equals(Object obj) {
if(obj instanceof UserPK){
UserPK key = (UserPK)obj;
if(this.userId.equals(key.getUserId()) && this.userName.equals(key.getUserName())){
return true;
}
}
return false;
}
}
方式三
主键类(UserPK类):该类实现java.io.Serializable接口,并重写 equals 和 hascode,不需要注解@Embeddable。
实体类(User类): 该类包含联合主键类中的字段,将联合主键字段都注解为 @Id,并在该类上方加上注解:@IdClass(联合主键类.class) 。实体类注解为@Entity和@Table。
实体类:
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
/**
* @author: ZHJ
* @date:Created in 11:15 2020/3/16
* @modify By:
* @description :User的实体类
*/
@Entity
@Table(name = "user")
@IdClass(UserPK.class)
public class User implements Serializable {
@Id
@Column(name = "user_id", nullable = false, length = 11)
private Integer userId;//联合主键字段
@Id
@Column(name = "user_name", nullable = false, length = 11)
private String userName;//联合主键字段
@Column(name = "age", nullable = true, length = 11)
private Integer age;
@Column(name = "email", nullable = true, length = 240)
private String email;
@Column(name = "birthday", nullable = true, length = 0)
private Date birthday;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
主键类:
import java.io.Serializable;
import java.util.Objects;
/**
* @author: ZHJ
* @date:Created in 11:21 2020/3/16
* @modify By:
* @description :User的联合主键类
*/
public class UserPK implements Serializable{
private Integer userId;
private String userName;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
//重写hashCode
@Override
public int hashCode() {
return Objects.hash(this.userId,this.userName);
}
//重写equal
@Override
public boolean equals(Object obj) {
if(obj instanceof UserPK){
UserPK key = (UserPK)obj;
if(this.userId.equals(key.getUserId()) && this.userName.equals(key.getUserName())){
return true;
}
}
return false;
}
}