Hibernate的联合主键注解方式

a 夏天 提交于 2020-03-16 11:57:55

某厂面试归来,发现自己落伍了!>>>

    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.Column;
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 UserPK getUserPK() {
        return userPK;
    }

    public void setUserPK(UserPK userPK) {
        this.userPK = userPK;
    }

    @Column(name = "age", nullable = true, length = 11)
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    @Column(name = "email", nullable = true, length = 240)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    @Column(name = "birthday", nullable = true, length = 0)
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

主键类:

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.*;
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 UserPK getUserPK() {
        return userPK;
    }

    public void setUserPK(UserPK userPK) {
        this.userPK = userPK;
    }

    @Column(name = "age", nullable = true, length = 11)
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    @Column(name = "email", nullable = true, length = 240)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    @Column(name = "birthday", nullable = true, length = 0)
    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;
    }
}

方式三

  • 主键类(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
    private Integer userId;//联合主键字段
    @Id
    private String userName;//联合主键字段
    private Integer age;
    private String email;
    private Date birthday;
    @Column(name = "user_id", nullable = false, length = 11)
    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    @Column(name = "user_name", nullable = false, length = 11)
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Column(name = "age", nullable = true, length = 11)
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    @Column(name = "email", nullable = true, length = 240)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    @Column(name = "birthday", nullable = true, length = 0)
    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;
    }
}

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!