JPA复合主键另一种实现--联合约束
前言
关于复合主键一般是三种方式,但必须创建复合主键类,然后通过注解的方式完成,这三种方式网上很容易找到,这里主要记录自己使用时的一些坑和项目中的特殊需求。
-
结合JPA使用时,关于Repository类中第二个参数不再是Long(主键id类型),而是复合主键类名
public interface XxxRepository extends JpaRepository<Xxx,XxxPK> { }
主键类中必须有无参构造器及重写hashcode和equals方法
findBy时可以直接查询具体的主键参数名,而不是复合主键类名
重点
-
特殊需求:
无论使用id单一主键还是复合主键,都只能存在一种,也就是一个类中不能存在两个主键
-
我的需求是仍然以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.... }
分析:id不能和firstName,lastName一起构成复合主键,否则id不同时其它两个参数可以分别相同,没有完成业务的需求,复合主键三种方式无法满足需求。
-
解决方式:使用联合约束,在类名的@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.... }
@UniqueConstraints
可以定义表的约束。如果是联合约束就这样使用@Table(name="PERSON",uniqueConstraints = {@UniqueConstraint(columnNames={"firstName", "lastName"})})
一开始认定是复合主键,尝试了很多次都无法满足这种不舍弃单一主键id的情况,后来百度到名为Davy_shark
大神的方法,果断解决,感谢!
另外JPA中使用复合主键感觉会比较麻烦,在查询的时候要根据具体使用哪种复合主键方式去进行实体的相应CRUD写法。
上一篇: DIV中文字换行显示
下一篇: c#递归理解