广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用SpringDataJpa创建中间表
  • 432
分享到

使用SpringDataJpa创建中间表

2024-04-02 19:04:59 432人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录springDataJpa创建中间表JPA中间表(关系表)联合主键配置说明问题场景数据表结构实体代码idClass类代码实体类最终正确代码持久层配置SpringDataJpa创建

SpringDataJpa创建中间表

//fetch=FetchType.EAGER 关闭懒加载 相当于hibernate中的lazy=false
	//joinColumns 配置中间表的主列
	//inverseJoinColumns=@JoinColumn(name="t_roleId") 创建中间表的副列
	@ManyToMany(fetch=FetchType.EAGER)
	@JoinTable(name="t1_user_permission",joinColumns=@JoinColumn(name="t_userId"),
	inverseJoinColumns=@JoinColumn(name="t_perId"))
	private List<Permission> perList;
 
//mappedBy="roleList" 变成双向
	//mappedBy="roleList" 把主权交给user 然后 role里面就不创建中间表了
	//表示声明自己不是多对多的关系维护端,由对方来维护
	@ManyToMany(mappedBy="perList",fetch=FetchType.EAGER)
	private List<User> userList;

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

问题场景

平时在开发中经常会出现多对多的关系,这个时候会创建一个关系表。但该关系表中并没有设置唯一主键字段而是联合主键,那么JPA下创建该关系表实体后运行项目会提示No identifier specified或does not define an IdClass的错误。

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

数据表结构

CREATE TABLE `mb_member_dept` (
    `member_id`  bigint(20) NOT NULL ,
    `dept_id`  bigint(20) NOT NULL ,
    PRIMARY KEY (`member_id`, `dept_id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci
ROW_FORMAT=DYNAMIC;

实体代码


@Getter
@Setter
@Entity
@Table(name = "mb_member_dept")
public class MemberDeptPO implements Serializable{
  private static final long serialVersionUID = 1271571231859316736L;
  
  @Column(name = "member_id", length = 20)
  private long memberId;
  
  @Column(name = "dept_id", length = 20)
  private long deptId;
}

观察以上代码似乎并没有什么问题,但在启动项目时会提示以下错误:

Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.test.po.MemberDeptPO

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

但再次启动项目时还是会提示一个does not define an IdClass的错误:

Caused by: java.lang.IllegalArgumentException: This class [class com.test.po.MemberDeptPO] does not define an IdClass

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

idClass类代码


@Getter
@Setter
public class MemberDepTKEy implements Serializable {
    private static final long serialVersionUID = -5482200454871393530L;
	
    private long memberId;
	
    private long deptId;
    public MemberDeptKey() { }
    public MemberDeptKey(long memberId, long deptId) {
        this.memberId = memberId;
        this.deptId = deptId;
    }
}

说明:MemberDeptKey类中的字段必须为MemberDeptPO类中的联合主键且字段名称需保持一致。

实体类最终正确代码

增加@IdClass(value = MemberDeptKey.class)和@Id注解


@Getter
@Setter
@Entity
@Table(name = "mb_member_dept")
@IdClass(value = MemberDeptKey.class) // 定义联合主键类
public class MemberDeptPO implements Serializable{
  private static final long serialVersionUID = 1271571231859316736L;
  
  @Id // 定义该字段为主键
  @Column(name = "member_id", length = 20)
  private long memberId;
  
  @Id // 定义该字段为主键
  @Column(name = "dept_id", length = 20)
  private long deptId;
}

持久层配置

@Repository
public interface IMemberDeptRepository extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
}

由于这里使用类联合主键,上面代码中的ID不能在使用Long而是需要使用MemberDeptKey进行定义,最终代码如下:

@Repository
public interface IMemberDeptRepository extends JpaRepository<MemberDeptPO, MemberDeptKey>, JpaSpecificationExecutor<MemberDeptPO> {
    
    MemberDeptPO findById(MemberDeptKey id);
}

当需要通过ID获取数据时则如下调用即可:

@Autowired
private IMemberDeptRepository memberDeptRepository;
MemberDeptPO memberDeptPO = memberDeptRepository.findById(new MemberDeptKey(1l, 0l));

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 使用SpringDataJpa创建中间表

本文链接: https://www.lsjlt.com/news/151213.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用SpringDataJpa创建中间表
    目录SpringDataJpa创建中间表JPA中间表(关系表)联合主键配置说明问题场景数据表结构实体代码idClass类代码实体类最终正确代码持久层配置SpringDataJpa创建...
    99+
    2022-11-13
  • 使用Oracle怎么创建多表查询中间表
    这篇文章将为大家详细讲解有关使用Oracle怎么创建多表查询中间表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。ORACLE 多表查询中间表的创建表与表之间关系的分类:  ...
    99+
    2023-06-06
  • oracle创建表空间
    drop tablespace qb including contents and datafiles; DROP TABLE...
    99+
    2022-10-18
  • Oracle创建表空间
    建立表空间并设置为默认表空间(最大32GB) 1. create temporary tablespace test tempfile ‘/home/oracle/oradata/abc/test.dbf‘ size 50m aut...
    99+
    2021-02-11
    Oracle创建表空间 数据库入门 数据库基础教程 数据库 mysql
  • linux 使用裸设备创建表空间
    环境系统环境[root@node1 ~]# uname -aLinux node1 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:43 EDT 2010 i686 i686 i386 GNU/Linux &n...
    99+
    2023-06-06
  • oracle创建表空间,临时表空间,用户
    create tablespace a_dat datafile 'D:\oracle\product\10.2.0\oradata\orcl\a_dat.dbf' size 1024m autoexten...
    99+
    2022-10-18
  • 创建表空间和临时表空间
     查看数据文件存放路径select FILE_ID,FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE from dba_data_files order ...
    99+
    2022-10-18
  • oracle中怎么创建表空间
    oracle中怎么创建表空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  创建数据库用户的具体过程:  1.假如现在已经建好名为'...
    99+
    2022-10-18
  • oracle中怎样创建表空间
    oracle中怎样创建表空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  ORACLE EBS操作某一个FORM界面,或者后台数据库操作某...
    99+
    2022-10-18
  • oracle表空间与用户创建
    -------------------------创建表空间与用户创建临时表空间CREATE TEMPORARY TABLESPACE test_temp TEMPFILE '/u01/oracle/pro...
    99+
    2022-10-18
  • Oracle创建表空间和用户
    =============================================================================  create temporary tablesp...
    99+
    2022-10-18
  • Oracle中怎么创建表空间和用户
    这期内容当中小编将会给大家带来有关Oracle中怎么创建表空间和用户,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  Oracle如何创建表空间,如何创建用户。在Wind...
    99+
    2022-10-18
  • Oracle创建表空间 用户 授权
    创建表空间 用户 授权create tablespace liuzhen_tablespace   datafile 'D:\liuzhen_oracle_data\liuzhen_data.db...
    99+
    2022-10-18
  • oracle创建表空间脚本
    oracle 10G 脚本CREATE TABLESPACE "UCXM_DATA" LOGGING  DATAFILE  'D:\oracle\produ...
    99+
    2022-10-18
  • Oracle 如何创建表空间
      在Oracle中如何创建表空间呢?主要有两种方式:一种是用SQL命令的方式,另外一种是通过Oracle客户端Enterprise Manager Console来创建。下面分别介绍一下:1 通...
    99+
    2022-10-18
  • oracle怎么创建表空间
    要在Oracle中创建表空间,可以使用CREATE TABLESPACE语句。以下是创建表空间的步骤:1. 使用SYSDBA权限登录...
    99+
    2023-08-18
    oracle
  • oracle如何创建表空间,创建用户,给用户赋权限
    小编给大家分享一下oracle如何创建表空间,创建用户,给用户赋权限,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!--创建临时表空间create temporary tablespace ...
    99+
    2022-10-19
  • plsql怎么创建表空间和用户
    要在PL/SQL中创建表空间和用户,可以按照以下步骤进行操作:1. 创建表空间:```CREATE TABLESPACE table...
    99+
    2023-09-09
    plsql
  • Oracle 创建表空间和用户脚本
    ===============================================================     create temporary tablespace C##FHADMIN_TEMP   tempf...
    99+
    2015-11-21
    Oracle 创建表空间和用户脚本
  • oracle创建表空间和用户授权
    创建表空间create  tablespace users  datafile  'D:\Oracle\oracle\oradata\users.dbf' size 100m&...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作