美文网首页
JPA中,联合主键的使用

JPA中,联合主键的使用

作者: 柚子光谱 | 来源:发表于2022-09-12 17:50 被阅读0次

前文介绍了 使用Spring Data JPA 实现数据读取,工作中有时会碰到联合主键的情况,本文来看看如何配置拥有联合主键的实体类

表结构

仍以前文中的 CATEGORY 表为例,可以看到这里设置了 CATEGORY_IDCATEGORY_NM 的联合主键。


定义联合主键需要遵守一些规则(具体可参考 JPA规范 - Primary Keys and Entity Identity):

  • 主键类必须是 public 且有 public 修饰的无参构造器
  • 主键类必须序列化
  • 主键类必须定义 equalshashCode 方法

此外,我们有两种方式可以配置联合主键:

  • @IdClass
  • @EmbeddedId

@IdClass 配合 @Id

创建一个用于存储主键字段的class

public class CategoryId implements Serializable {
  private static final long serialVersionUID = 1017853314829862199L;

  private Integer categoryId;
  private String categoryNm;

  // No-Arg Constructor
  // Getter and Setter

}

然后在 Category 类中使用 @IdClass@Id 来分别标记类和字段:

@Entity
@Table(name = "CATEGORY")
@IdClass(CategoryId.class) // 标记联合主键类
public class Category {
  private static final long serialVersionUID = 1017853314829862199L;

  @Id // 标记主键对应的字段
  @Column(name = "CATEGORY_ID")
  private Integer categoryId;

  @Id // 标记主键对应的字段
  @Column(name = "CATEGORY_NM")
  private String categoryNm;

  @Column(name = "CREATE_ID")
  private String createId;

  // other fields, getters and setters

}

@EmbeddedId 配合 @Embeddable

我们配置一个 CategoryId 类,并使用 @Embeddable 标记这个类

@Embeddable
public class CategoryId implements Serializable {
  private static final long serialVersionUID = 1017853314829862199L;

  private Integer categoryId;
  private String categoryNm;

  // No-Arg Constructor
  // Getter and Setter

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    CategoryId entity = (CategoryId) o;
    return Objects.equals(this.categoryNm, entity.categoryNm) &&
        Objects.equals(this.categoryId, entity.categoryId);
  }

  @Override
  public int hashCode() {
    return Objects.hash(categoryNm, categoryId);
  }

}

然后我们需要在 Category 类中的对应字段上标记 @EmbeddedId 来嵌入这个id class

@Entity
@Table(name = "CATEGORY")
public class Category {

  @EmbeddedId
  private CategoryId id;

  @Column(name = "CREATE_ID")
  private String createId;

  // other fields, getters and setters
}

这样我们就完成了entity以及其联合主键的配置,但在获取结果集的使用上这两种类型的配置会有一些区别。

比如在使用 @IdClass, @Id 的配置中,可以直接使用 category.getCreateId()。而使用了 @EmbeddedId, @Embeddable 的配置中,需要category.getCategoryId().getCategoryNm() 才能得到结果。

以上就是最简单的关于联合主键的配置和用法。

相关文章

网友评论

      本文标题:JPA中,联合主键的使用

      本文链接:https://www.haomeiwen.com/subject/gnahyrtx.html