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写法。
相关文章推荐
- JPA注解实现联合主键
- JPA联合主键
- 复合主键与联合主键
- JPA视频学习(六)联合主键
- jpa复合主键的使用
- spring-data-jpa使用联合主键后出现operand should contain 1 column(s)
- 复合主键与联合主键
- JPA 菜鸟教程 11 复合主键-2个@Id
- MySQL—修改表时给表添加联合主键约束
- JPA 联合主键(多主键)映射
- 添加以联合主键之一作为外键的约束时,出错:此列列表的唯一关键字或主键不匹配
- oracle主键自动增长的实现 Oracle Sequence oracle maxid自动生成--ORA-00001: 违反唯一约束条件 (NAME.SYS_C005547)产生的原因之一(select * from all_cons_columns w
- SpringData JPA复合主键
- 在LINQ中实现多条件联合主键LEFT JOIN
- JPA关联映射 - 复合主键映射
- oracle:PK,Fk,联合主键,NOTNULL 约束详解
- JPA 复合主键
- django 中多字段主键(复合、联合主键)
- 复合主键映射(联合主键) .
- Spring Data Jpa 复合主键