JPA 复合主键

参考链接:https://www.cnblogs.com/boywwj/p/8031106.html、https://www.cnblogs.com/lich/archive/2011/12/03/2274672.html


 

  1.复合主键定义:

    一张表存在多个字段共同组成一个主键,这多个字段的组合不能重复,但是单独一个可以重复。

  2.思路:

    STEP 1:需求

    数据库中的表没有主键,而是由复合主键代替。但项目中所需的程序规定,必须要设定主键,即有这样的标识:

 /**    用户Id*/
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id" ,length = 32)
  String id;

    STEP 2:创建复合主键

    但因为项目中设定的是复合主键,所以不能使用这样的形式来设置主键,要新建一个复合主键类:

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;

@Data
@Embeddable
public class Key implements Serializable {

    /***/
    @Column(name = "firstName" ,length = 32)
    String firstName;

    /***/
    @Column(name = "lastName" ,length = 32)
    String lastName;
}

    STEP 3:插入复合主键

    创建复合主键类后,将复合主键以下列形式写入程序即可。

import lombok.Data;
import javax.persistence.*;

@Entity
@Data
@Table(name = "student")
public class Student {

 /** 姓名的复合主键 */
  @EmbeddedId
  private Key id;


 /** 祖先节点和孙子节点的距离 */
  @Column(name = "age" ,length = 11)
  Integer age;
}

     使用注意:

  1) 实现Serializable接口(否则会报错,错误会直接显示); 

  2) 在复合主键的类上,使用注解@Embeddable

  3) 有默认的public无参数的构造方法(在我这个实例中,我没有添加有参构造方法,所以采用默认的构造方法)。如果你在实体类里有有参构造方法,那么一定要有一个无参构造方法,否则运行的时候会报错。

  4) 重写equalshashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。hashCode方法返回当前对象的哈希码(我验证EntityManger,不重写也没事。);

posted @ 2021-10-13 16:30  Ukimi  阅读(632)  评论(0)    收藏  举报