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

前言

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

  • 结合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写法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值