联合主键:

就是用2个或2个以上的字段组成主键。用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。适用于例如关系表这种多对多的场景。

语句:alter table 表名 add primary key (字段1,字段2,字段3);

spring jpa 如何使用联合主键:

例子:name和idcardno共同组成了主键

name    idcardno    age    addresss

张三    12                 3        地址

 

 

一、Spring Data Jpa 复合主键 

1.1、编写一个复合主键类:PeopleKey

@Embeddable
public class PeopleKey implements Serializable  {
     
    @Column(name = "name")
    private String name;
     
    @Column(name = "idcardno")
    private String idcardno;
    // 省略setter,getter方法
 
    @Override
    public String toString() {
        return "PeopleKey [name=" + name + ", idcardno=" + idcardno + "]";
    }
}

注意:

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

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

3) 有默认的public无参数的构造方法(在我这个实例中,我没有添加有参构造方法,所以采用默认的构造方法)

如果你在实体类里有有参构造方法,那么一定要有一个无参构造方法,否则运行的时候会报错

org.hibernate.InstantiationException: No default constructor for entity:  : com.my.model.People

这个就是没有默认的构造方法造成的,所以要在实体类中加入默认的无参构造方法。

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

1.2、编写实体类:People

package com.my.model;
 
import javax.persistence.*;
@Entity
@Table(name = "people")
//@IdClass(PeopleKey.class)
public class People extends PeopleKey{
    // 复合主键要用这个注解
    @EmbeddedId
    private PeopleKey id;
 
    @Column(name = "age")
    private int age;
     
    @Column(name = "address")
    private String address;
 
    // 省略setter,getter方法
    @Override
    public String toString() {
        return "People [id=" + id + ", age=" + age + ", address=" + address
                + "]";
    }  
}

还可以采用@IdClass来注解复合主键 ,过程和@Embeddable差不多,这里直接贴例子。


@Entity
@Table(name = "people")
@IdClass(PeopleKey.class)
public class People implements Serializable {

// @EmbeddedId
// private PeopleKey id;

@Id
@Column(name = "name")
private String name;
@Id
@Column(name = "idcardno")
private String idcardno;

@Column(name = "age")
private int age;

@Column(name = "address")
private String address;

}

 

发表评论

邮箱地址不会被公开。 必填项已用*标注