【Java】JPA 复合主键Support

Composite Primary Key定义

Composite Primary Key 译作复合主键,也有译作联合主键 ​,总归是指在一张表中,由一个以上的列联合起来作为主键的一种主键定义方式。


create table student ( name varchar(10) null, age varchar(10) null, grade varchar(10) null ); alter table student add constraint user_pk primary key (name,grade);

对应的业务是创建了一个学生的表,本来想用name作为唯一标识,但是后面发现不同年级学生之间有重名,于是将年级(grade) 和name 联合起来标识一个学生,

JPA对Composite的支持

@IdClass

【Java】JPA 复合主键Support【Java】JPA 复合主键Support

代码实现如图所示这时候name 和grade仍然是Student的属性,但是两者联合起来才能成为一个student的唯一标示了。

@EmbeddedId

EmbeddedId 是另一种实现复合组件的形式。

【Java】JPA 复合主键Support【Java】JPA 复合主键Support

@IdClass Vs [email protected]_

​两种实现​对应的是两种不同的场景,要区分用那种,其实就考虑下某个属性独立存在有没有业务含义。

没有独立的业务含义时用EmbeddedId

比如EmbeddedId例子中对应的场景是文件的档案标识是文档类型编码TypeNumber (A、RC、IOS)等,而serialNumber则是文档编号,唯一确定一个文档就需要两者组合,例如IOS9001这类。9001以及IOS在文档业务中,大概率不会单独拿出来。(具体还是要看业务)

有独立业务含义时用IdClass

例如Student的例子中,name grade都有相对更加独立的业务含义,虽然有些场景会一起拿出来(如三年二班周杰伦),但是也有些场景会单独拎出来,那这个时候IdClass要比EmbeddedId要更加合适一些。

总之,如果我们常常访问主键的一部分则使用@IdClass 而经常使用组件的全部则使用@EmbeddedId

以上是 【Java】JPA 复合主键Support 的全部内容, 来源链接: utcz.com/a/96950.html

回到顶部