springdatajpa多表查询,

  springdatajpa多表查询,

  

目录

春季数据作业的装配区(JobPackArea)创建中间表作业的装配区(JobPackArea)中间表(关系表)联合主键配置说明问题场景数据表结构实体代码idClass类代码实体类最终正确代码持久层配置

 

  

SpringDataJpa创建中间表

//fetch=FetchType .渴望的关闭懒加载相当于冬眠中的lazy=false//连接列配置中间表的主列//inverseJoinColumns=@ join column(name= t _ roleId )创建中间表的副列@ManyToMany(fetch=FetchType .渴望)@ JoinTable(name= t1 _ user _ permission ,join columns=@ join column(name= t _ userId ),inverseJoinColumns=@ join column(name= t _ perId ))private list perList权限perList//mappedBy=roleList 变成双向//mappedBy=roleList 把主权交给用户然后作用里面就不创建中间表了//表示声明自己不是多对多的关系维护端,由对方来维护@ManyToMany(mappedBy=perList ,fetch=FetchType .渴望)私有列表用户用户列表;

 

  

JPA中间表(关系表)联合主键配置说明

 

  

问题场景

平时在开发中经常会出现多对多的关系,这个时候会创建一个关系表。但该关系表中并没有设置唯一主键字段而是联合主键,那么作业的装配区(JobPackArea)下创建该关系表实体后运行项目会提示未指定标识符或未定义IdClass的错误。

 

  下面以用户部门关系进行举例说明,用户和部门是多对多的关系。

  

数据表结构

创建表` MB _ member _ dept `(` member _ id ` bigint(20)NOT NULL,` dept_id` bigint(20) NOT NULL,主键(` member _ id `,` dept _ id `))ENGINE=innodb默认字符集=ut F8 MB 4 COLLATE=ut F8 MB 4 _ general _ ciROW _ FORMAT=DYNAMIC;

 

  

实体代码

/*** 用户部门实体* @作者lizebin * @版本1.0 * @日期2021/2/18 12:48上午* * */@ Getter @ Setter @ Entity @ Table(name= MB _ member _ dept )公共类MemberDeptPO实现serializable { private static final long serialVersionUID=1271571231859316736 l;/** * 联合主键用户ID */@Column(name=member_id ,长度=20)私有长成员d/** *联合主键部门ID */@Column(name=dept_id ,length=20)private long deptId;}观察以上代码似乎并没有什么问题,但在启动项目时会提示以下错误:

 

  由: org。冬眠。批注异常:导致没有为实体: com。测试。阿宝。成员deppo指定标识符

  此时需要在联合主键字段会员编号和部门上增加@Id注解即可解决以上错误。这里需要注意的是,一般出现以上错误提示时只要在主键字段上增加@Id注解即可解决问题。

  但再次启动项目时还是会提示一个未定义IdClass的错误:

  由: Java。郎。illegalargumentexception :导致此类【类com。测试。阿宝。成员deppo]未定义IdClass

  这是因为联合主键时需要额外定义一个idClass类作为实体的ID,idClass类代码如下:

  

idClass类代码

/*** 用户部门关系联合主键定义* @作者lizebin * @版本1.0 * @日期2021/2/18 10:36上午***/@Getter@Setterpublic类MemberDeptKey实现serializable { private static final long serialVersionUID=-5482200454871393530 l;/**联合主键,字段名称与MemberDeptPO类中一致*/private long memberId;/**联合主键,字段名称与MemberDeptPO类中一致*/private long deptId;public member dept key(){ } public member dept key(long memberId,long deptId){ this。memberId=memberIdthis.deptId=deptId}}说明:MemberDeptKey类中的字段必须为MemberDeptPO类中的联合主键且字段名称需保持一致。

 

  

实体类最终正确代码

增加@ id class(value=成员部门键。类)和@Id注解

 

  /*** 用户部门实体* @作者lizebin * @版本1.0 * @日期2021/2/18 12:48上午* * */@ Getter @ Setter @ Entity @ Table(name= MB _ member _ dept )@ id class(value=member dept key。class)//定义联合主键类公共类MemberDeptPO实现serializable { private static final long serialVersionUID=1271571231859316736 l;/** * 联合主键用户ID */@Id //定义该字段为主键@Column(name=member_id ,length=20)private long memberId;/** * 联合主键部门ID */@Id //定义该字段为主键@Column(name=dept_id ,length=20)private long deptId;}

  

持久层配置

@ repository公共接口IMemberDeptRepository扩展JpaRepositoryT,ID,JpaSpecificationExecutorT {}由于这里使用类联合主键,上面代码中的身份不能在使用长的而是需要使用MemberDeptKey进行定义,最终代码如下:

 

  @ repository公共接口IMemberDeptRepository扩展JpaRepositoryMemberDeptPO,MemberDeptKey,JpaSpecificationExecutorMemberDeptPO {/* *通过身份获取数据信息*/member dept to find byid(成员部门关键字id);}当需要通过身份获取数据时则如下调用即可:

  @ auto wired private IMemberDeptRepository member depository;成员部门po成员部门po=成员部门存储库。find byid(新成员部门键(1l,0l));以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行它.

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: