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

目录
  • jpa 无法删除onetomany中many问题
    • 问题描述
    • 解决思路
    • 小结一下
  • jpa @OneToMany 删除不了集合数据

jpa 无法删除onetomany中many问题

问题描述

今天在做项目遇到一个问题,建立两个实体order和orderDetail,他们是onetomany关系,当我想要之间删除一个orderDetail时,发现不能删除但是程序也不出错。

实体建立模型如下图:

order中:

orderDetail中:

解决思路

1.首先我想到了直接删除orderDetail不行,是否可以直接通过update order的关联关系进行级联删除啦,于是写了一下代码

结果发现这样是可以删除orderDetail,但是这种删除方式并不是我想要的,而且感觉也不是最好的解决方法。

2.在结合上一种方法实现成功后,突然想到是否是关联关系建立的原因,如果我先把关联关系断开,在进行删除orderDetail是否能成功:

结果证明,成功删除

小结一下

虽然实现了我想要的功能,但是jpa的删除具体逻辑还需要深入研究。自我感觉是因为order是关系维护方,想要删除many端就必须先断开关系在进行删除

jpa @OneToMany 删除不了集合数据

在使用jpa的时候,如果有@OneToMany关系。想删除many的单个数据。有时候删除不了。 jap关系如下:一个用户对应多个角色。并且user实体中CascadeType.ALL

//user实体
@OneToMany(cascade = CascadeType.ALL,fetch= FetchType.LAZY,mappedBy = "user")
    private Set<Role> roles = new HashSet<Role>();

//role实体
@ManyToOne(fetch= FetchType.LAZY)
    @JoinColumn(name="user_id")
    private User user;

这时候如果想删除role。必须做2个事情,1、删除role。2、把role从集合roles中移除。如下:

roleRepo.delete(role);//这里删除操作需要delete和从集合中remove一起操作才能生效
user.getRoles().remove(role);
userService.update(user);

如果不这样操作。就会不生效。

参考文档: https://stackoverflow.com/questions/2011519/jpa-onetomany-not-deleting-child

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

(0)

相关推荐

  • 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中无法删除onetomany中many问题的解决

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

  • java中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末.看总结.. JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常说的foreach循环).iterator遍历. 1.for循环遍历list for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")

  • php中批量删除Mysql中相同前缀的数据表的代码

    方法一: 复制代码 代码如下: <?php mysql_connect('','',''); mysql_select_db(''); $rs=mysql_query('show tables'); while($arr=mysql_fetch_array($rs)){ $TF=strpos($arr[0],'class_'); if($TF===0){ $FT=mysql_query("drop table $arr[0]"); if($FT){ echo "$arr

  • python实现删除列表中某个元素的3种方法

    python中关于删除list中的某个元素,一般有三种方法:remove.pop.del: 1.remove: 删除单个元素,删除首个符合条件的元素,按值删除 举例说明: >>> str=[1,2,3,4,5,2,6] >>> str.remove(2) >>> str [1, 3, 4, 5, 2, 6] 2.pop: 删除单个或多个元素,按位删除(根据索引删除) >>> str=[0,1,2,3,4,5,6] >>&g

  • Java编程删除链表中重复的节点问题解决思路及源码分享

    一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4->5 处理后为:1->2->5 三. 思路 个人感觉这题关键是注意指针的指向,可以定义一个first对象(值为-1,主要用于返回操作后的链表),first.next指向head,定义一个last同样指向first(主要用于操作记录要删除节点的前一个节点),定义一个p指向head,指向当前节点.

  • Perl中怎样从数组中删除某个值?

    我不确定undef是否和从数组中消除值有确切的关系,猜测一下,如果我们将undef视为"空",那么会有一些联系.但通常来说,将某些东西赋值为undef和删除某些东西是不一样的. 首先来看怎样把数组的元素赋值为undef,之后再了解如何从数组中删除元素. 从下面的代码开始: 复制代码 代码如下: use Data::Dumper qw(Dumper); my @dwarfs = qw(Doc Grumpy Happy Sleepy Sneezy Dopey Bashful); print

  • Golang编程实现删除字符串中出现次数最少字符的方法

    本文实例讲述了Golang编程实现删除字符串中出现次数最少字符的方法.分享给大家供大家参考,具体如下: 描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出: 删除字符串中出现次数最少的字符后的字符串. 样例输入: abcdd 样例输出: dd 代码实现: 复制代码 代码如下: package huawei impo

  • AngularJS删除路由中的#符号的方法

    最近做一个web应用,有个需求需要删除angular路由中的#号. 例如: http://example.com/ http://example.com/#/about http://example.com/#/contact 需要改成 http://example.com/ http://example.com/about http://example.com/contact 这个是angular默认自带的,所以想要删除需要配置一下: $locationProvider.html5Mode(t

  • JS实现从表格中动态删除指定行的方法

    本文实例讲述了JS实现从表格中动态删除指定行的方法.分享给大家供大家参考.具体如下: JS的表格对象有一个deleteRow方法用于删除表格中的指定行,只需要指定行号即可 <!DOCTYPE html> <html> <head> <script> function deleteRow(r) { var i=r.parentNode.parentNode.rowIndex; document.getElementById('myTable').deleteR

  • Centos系统中彻底删除Mysql数据库步骤

    详细步骤如下所示: 1.输入命令查询系统中已安装的mysql. rpm -qa |grep -i mysql 2.逐个卸载mysql. yum remove 系统显示已安装的mysql 比如: yum remove mysql-community-server-5.7.19-1.el7.x86_64 3.卸载完成后使用find命令来查找系统中存在的mysql文件夹. find / -name mysql 4.使用rm -rf命令逐个删除文件夹路径即可. 比如: rm -rf /etc/logro

随机推荐