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

浙公网安备 33010602011771号