基于Jpa中ManyToMany和OneToMany的双向控制

目录
  • Jpa ManyToMany和OneToMany的双向控制
    • 1、ManyToMany   
    • 2、OneToMany以及ManyToOne
  • JPA中ManyToMany关系问题
    • 解决办法

Jpa ManyToMany和OneToMany的双向控制

下面我们使用权限管理中Role<->Account(用户ManyToMany账号)、Role<->Domain(用户OneToMany权限域)的关系来举例。   

1、ManyToMany   

Role表   

Account表   

在两个表的对应属性上添加JoinColumns和inverseJoinColumns,并且相互交换。   

  • JoinColumn指定本表在中间表中的列名。   
  • inverseJoinColumns指定受控方的列名。   

在两个类中都加上这两个属性,并且值互换,则能够实现双向控制,即任何一方删除,都会自动删除对应中间表的数据。

2、OneToMany以及ManyToOne

Role表   

Domain表   

cascade用来指定级联操作, cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。   

如果不指定Cascade,默认是空的,那么在删除Role的时候,只会把Domain表中的role这一列的值删除,而该条记录不删除。   

JoinColumn需要指定,如果不指定就会在Domain表中增加额外的一列,这一列与Domain的id一样。经过试验,不指定还会造成级联查找失败,原因未知。

JPA中ManyToMany关系问题

配置JPA的时候多对多关系,报以下错误:

org.hibernate.AnnotationException: Illegal use of mappedBy on both sides of the relationship: com.csair.gme.core.domain.ComponentType.componentPropertys

解决办法

不能两边都用mappedBy,只能用一边,而且用mappedBy的那一边是从表,另外一边就是主表。mappedBy=‘主表里的变量名'

问题解决!

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

(0)

相关推荐

  • spring jpa ManyToMany原理及用法详解

    1.java和jpa 中所有的关系都是单向的.这个关系数据库不同,关系数据库,通过外键定义并查询,使得反向查询总是存在的. 2.JPA还定义了一个OneToMany关系,它与ManyToMany关系类似,但反向关系(如果已定义)是ManyToOne关系. OneToMany与JPA中ManyToMany关系的主要区别在于,ManyToMany总是使用中间关系连接表来存储关系, OneToMany可以使用连接表或者目标对象的表引用中的外键源对象表的主键. @OneToMany(cascade =

  • jpa实体@ManyToOne @OneToMany无限递归方式

    目录 jpa实体@ManyToOne @OneToMany无限递归 问题描述 解决办法 @OneToMany和@ManyToOne要素 jpa实体@ManyToOne @OneToMany无限递归 问题描述 Cannot call sendError() after the response has been committed 解决办法 在属性上添加注释 @JsonBackReference // data to json 和 JsonIgnore一样 // @JsonManagedRefer

  • 解决JPA @OneToMany及懒加载无效的问题

    目录 JPA @OneToMany及懒加载无效 @OneToMany 小结一下吧 实现JPA的懒加载和无外键 例如 转换时使用 JPA @OneToMany及懒加载无效 @OneToOne @ManyToMany使用不做过多解释,重点解决"懒加载无效问题". 示例: @OneToMany teacher 和 student是一对多关系 只需要在studentList上使用@OneToMany注解,对应的参数为 懒加载.级联操作.子表外键 我为了验证懒加载是否生效,在debug模式下发现

  • SpringData JPA中@OneToMany和@ManyToOne的用法详解

    目录 一. 假设需求场景 二. 代码实现 2.1 级联存储操作 2.2 查询操作和toSting问题 2.3 级联删除 2.4 pom.xml 一. 假设需求场景 在我们开发的过程中,经常出现两个对象存在一对多或多对一的关系.如何在程序在表明这两个对象的关系,以及如何利用这种关系优雅地使用它们. 其实,在javax.persistence包下有这样两个注解--@OneTomany和@ManyToOne,可以为我们所用. 现在,我们假设需要开发一个校园管理系统,管理各大高校的学生.这是一种典型的一

  • 基于Jpa中ManyToMany和OneToMany的双向控制

    目录 Jpa ManyToMany和OneToMany的双向控制 1.ManyToMany 2.OneToMany以及ManyToOne JPA中ManyToMany关系问题 解决办法 Jpa ManyToMany和OneToMany的双向控制 下面我们使用权限管理中Role<->Account(用户ManyToMany账号).Role<->Domain(用户OneToMany权限域)的关系来举例. 1.ManyToMany Role表 Account表 在两个表的对应属性上添加J

  • 关于jpa中无法删除onetomany中many问题的解决

    目录 jpa 无法删除onetomany中many问题 问题描述 解决思路 小结一下 jpa @OneToMany 删除不了集合数据 jpa 无法删除onetomany中many问题 问题描述 今天在做项目遇到一个问题,建立两个实体order和orderDetail,他们是onetomany关系,当我想要之间删除一个orderDetail时,发现不能删除但是程序也不出错. 实体建立模型如下图: order中: orderDetail中: 解决思路 1.首先我想到了直接删除orderDetail不

  • 基于JPA中的@Basic注解详解

    今天我们来聊聊JPA @Basic注解的使用 1.介绍: @Basic 是实体类与数据库字段映射时最简单的类型.在该注解的介绍中: The <code>Basic</code> annotation can be applied to a persistent * property or instance variable of any of the following types: Java * primitive types, wrappers of the primitive

  • 基于Spring中各个jar包的作用及依赖(详解)

    先附spring各版本jar包下载链接http://repo.spring.io/release/org/springframework/spring/ spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2.jar 示例图片为Spring-2.5.6.jar的包目录 下面讲解各个jar包的作用: 1.org.springframework.aop或sp

  • Spring boot基于JPA访问MySQL数据库的实现

    本文展示如何通过JPA访问MySQL数据库. JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据,结合其他ORM的使用,能达到简化开发流程的目的,使开发者能够专注于实现自己的业务逻辑上. Spring boot结合Jpa 能够简化创建 JPA 数据访问层和跨存储的持久层功能,用户的持久层Dao接口只需要继承定义好的接口,无需再写实现类,就可以实现对象的CRUD操作以及分页排序等功能. 环境要求

  • 基于JPA的Repository使用详解

    目录 Spring Data JPA Repository CrudRepository PagingAndSortingRepository JpaRepository JpaSpecificationExecutor JpaRepository查询功能 Jpa方法命名规则 使用方法 解析过程 JPA自定义Repository方法 下面是具体的实现 经过实践发现 Spring Data JPA Spring Data是Spring提供的操作数据的框架,Spring Data JPA是Sprin

  • 详解Spring Data JPA中Repository的接口查询方法

    目录 1.查询方法定义详解 2.搜索查询策略 3.查询创建 4.属性表达式 5.特殊参数处理 6.限制查询结果 7. repository方法返回Collections or Iterables 8.repository方法处理Null 9.查询结果流 10.异步查询结果 1.查询方法定义详解 repository代理有两种方式从方法名中派生出特定存储查询. 通过直接从方法名派生查询. 通过使用一个手动定义的查询. 可用的选项取决于实际的商店.然而,必须有一个策略来决定创建什么实际的查询. 2.

  • 基于python中的TCP及UDP(详解)

    python中是通过套接字即socket来实现UDP及TCP通信的.有两种套接字面向连接的及无连接的,也就是TCP套接字及UDP套接字. TCP通信模型 创建TCP服务器 伪代码: ss = socket() # 创建服务器套接字 ss.bind() # 套接字与地址绑定 ss.listen() # 监听连接 inf_loop: # 服务器无限循环 cs = ss.accept() # 接受客户端连接 comm_loop: # 通信循环 cs.recv()/cs.send() # 对话(接收/发

  • 基于angular中的重要指令详解($eval,$parse和$compile)

    在angular的服务中,有一些服务你不得不去了解,因为他可以说是ng的核心,而今天,我要介绍的就是ng的两个核心服务,$parse和$compile.其实这两个服务讲的人已经很多了,但是100个读者就有100个哈姆雷特,我在这里讲讲自己对于他们两个服务的理解. 大家可能会疑问,$eval呢,其实他并不是一个服务,他是scope里面的一个方法,并不能算服务,而且它也基于parse的,所以只能算是$parse的另一种写法而已,我们看一下ng源码中$eval的定义是怎样的就知道了 $eval: fu

  • 基于python中staticmethod和classmethod的区别(详解)

    例子 class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod def class_foo(cls,x): print "executing class_foo(%s,%s)"%(cls,x) @staticmethod def static_foo(x): print "executing static_foo(%s)"%x a=A(

随机推荐