您的位置:首页 > 其它

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

2017-12-06 13:49 302 查看

前言

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

结合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写法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息