您的当前位置:首页正文

JPA 复合主键的增删改查操作

2024-12-02 来源:个人技术集锦

一、JPA和复合主键的简介

JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合。JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的目标是为了整合第三方ORM框架,建立一套标准的API。目前JPA的提供商包括ORacle,Redhat,Eclipse等,提供的产品包括Hiberate, Eclipselink, Toplink, Spring Data JPA等。
复合主键也就是说需要多个字段才能确定数据库记录中的唯一一行。这样就需要多个字段一起,组成主键,也叫联合主键。比如将PC中所有应用的网络信息保存到一个数据表中,可以将IP和端口设置为复合主键。

二、复合主键在JPA中的使用

JPA中实现复合主键的SQL语言如下:

CREATE TABLE user_project(
  user_id            INT(20),
  project_id         INT(20),
  timestamp         VARCHAR (50),
  donate_money       DOUBLE(10,2),
  PRIMARY KEY (user_id,project_id)
);

在代码中实现复合主键的方式有两种,一种是通过@IdClass注解指定复合主键对象;另一种是通过复合主键对象+@Embeddable,和实体对象+@Embedded注解。关于@IdClass的注解在此不做介绍,@Embedded和@Embedded的实现方式参考如下:

//主键类
@Embeddable
public class PrimaryKey implements Serializable{
    private Integer a_id;
    private Integer b_id;
    public Integer getA_id() {
        return a_id;
    }
    public void setA_id(Integer a_id) {
        this.a_id = a_id;
    }
    public Integer getB_id() {
        return b_id;
    }
    public void setB_id(Integer b_id) {
        this.b_id = b_id;
    }
}

//实体类
@Entity
@Table(name="A")
public class A{
    @EmbeddedId
    private PrimaryKey idCLass;

    public PrimaryKey getIdCLass() {
        return idCLass;
    }
    public void setIdCLass(PrimaryKey idCLass) {
        this.idCLass = idCLass;
    }
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

三、复合主键的增删改查

3.1 增加操作
带有复合主键的数据库的保存操作,和只有单个主键的保存操作相同,如下:

  • 保存一个实体,repository.save(T entity)
  • 保存多个实体,repository.save(Iterable< T> entities)
  • 保存并立即刷新一个实体,repository.saveAndFlush(T entity)

3.2 查询操作
带有复合主键的数据库的查询操作,可以用复合主键作为整体进行查询
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.setA_id(1);
primaryKey.setB_id(2);
repository.findOne(primaryKey);
3.3 更新操作
更新操作的参考代码如下:

    @Transactional
    @Modifying
    public void update(A a) {
            A finda = repository.findOne(a.getIdCLass());   //这里的repository是继承于JpaRepository的接口
            finda.set(secondlevelEntity.getName());
    }

3.4 删除操作
删除操作的参考代码如下:

 @Transactional
    @Modifying
    public void update(A a) {
            A finda = repository.findOne(a.getIdCLass());   //这里的repository是继承于JpaRepository的接口
            repository.delete(finda);
    }

参考文献

1.
2.
3.
4.
5.
6.

显示全文