欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JPA复合主键另一种实现--联合约束

程序员文章站 2022-04-24 22:39:48
...

前言

关于复合主键一般是三种方式,但必须创建复合主键类,然后通过注解的方式完成,这三种方式网上很容易找到,这里主要记录自己使用时的一些坑和项目中的特殊需求。

  • 结合JPA使用时,关于Repository类中第二个参数不再是Long(主键id类型),而是复合主键类名

    public interface XxxRepository extends JpaRepository<Xxx,XxxPK> {
    }
  • 主键类中必须有无参构造器及重写hashcode和equals方法

  • findBy时可以直接查询具体的主键参数名,而不是复合主键类名

重点

  • 特殊需求:

    1. 无论使用id单一主键还是复合主键,都只能存在一种,也就是一个类中不能存在两个主键

    2. 我的需求是仍然以id为主键,但是其中某几个属性分别相同时是不允许的,也就相当于这几个属性构成了复合主键,比如一下Person类,主键是id,但当某两个person实例中的firstName和lastName分别相同时是无法保存的,相当于这俩参数构成了复合主键

      @Entity
      @Table(name="PERSON")
      public class Person{
      @Id
      private Long id;
      private String firstName;
      private String lastName;
      // get,set....
      }
    3. 分析:id不能和firstName,lastName一起构成复合主键,否则id不同时其它两个参数可以分别相同,没有完成业务的需求,复合主键三种方式无法满足需求。

    4. 解决方式:使用联合约束,在类名的@Table注解上加入下面的参数即可

      uniqueConstraints = {@UniqueConstraint(columnNames={"username", "tenant"})}
      @Entity
      @Table(name="PERSON",uniqueConstraints = {@UniqueConstraint(columnNames={"firstName", "lastName"})})
      public class Person{
      @Id
      private Long id;
      private String firstName;
      private String lastName;
      // get,set....
      }
    5. @UniqueConstraints 可以定义表的约束。如果是联合约束就这样使用@Table(name="PERSON",uniqueConstraints = {@UniqueConstraint(columnNames={"firstName", "lastName"})})

一开始认定是复合主键,尝试了很多次都无法满足这种不舍弃单一主键id的情况,后来百度到名为Davy_shark大神的方法,果断解决,感谢!
另外JPA中使用复合主键感觉会比较麻烦,在查询的时候要根据具体使用哪种复合主键方式去进行实体的相应CRUD写法。