hibernate 多对多操作删除

hibernate 多对多删除解决方案 <br />hibernate多对多当中,我们常常希望只删除一方已及对应的关系,但不想删除另一方,怎么样达到呢? (这里只提删除)<br />表user和表role多对多,中间表user_role(userId,roleId),user是主控方,role是从方,<br />在spring+hibernate的环境下,使用的是Annotation配置<br /> <br />User.java<br />@ManyToMany(cascade = {CascadeType.MERGE,CascadeType. 阅读详情

hibernate 多对多操作

关键字: hibernate 多对多操作
多对多的两种映射形式:
一。映射多对多关系
老师Teacher 与 课程Course 是一个多对多的关系,XMl配置如下。
三个表的表结构
1. tbl_course.sql
    create table "SCOTT"."TBL_COURSE"(
        "ID" CHAR(32) not null,
       "NAME" VARCHAR2(20) not null,
        constraint "SYS_C005315" primary key ("ID")
    );
2. tbl_teacher.sql
    create table "SCOTT"."TBL_TEACHER"(
        "ID" CHAR(32) not null,
       "NAME" VARCHAR2(20) not null,
        constraint "SYS_C005313" primary key ("ID")
    );
3.tbl_teacher_course.sql
  create table "SCOTT"."TBL_TEACHER_COURSE"(
        "TID" CHAR(32),
       "CID" CHAR(32)
    );

Teacher.hbm.xml
<hibernate-mapping>
    <class name="mapping.Teacher" table="teacher" schema="dbo" catalog="Student">
        <id name="id" type="string">
            <column name="ID" length="32" />
            <generator class="uuid" />
        </id>
        <property name="name" type="string">
            <column name="Name" length="50" not-null="true" />
        </property>
        <set access="property" name="courses" lazy="true" inverse="true" 
             cascade="save-update"  batch-size="10" fetch="select" 
             table="teacher_course"> 
             <key column="TID" />
             <many-to-many class="mapping.Course1" column="CID" /> 
         </set> 
    </class>
</hibernate-mapping>

COURSE.hbm.xml
<hibernate-mapping>
    <class name="mapping.Course" table="course" schema="dbo" catalog="Student">
        <id name="id" type="string">
            <column name="ID" length="32" />
            <generator class="uuid" />
        </id>
        <property name="cname" type="string">
            <column name="cname" length="50" />
        </property>
        <set access="property" name="teachers" lazy="true" inverse="false" 
             cascade="save-update"  batch-size="10" fetch="select"  table="teacher_course"> 
             <key column="CID" />
             <many-to-many class="mapping.Teacher" column="TID" /> 
         </set>
    </class>
</hibernate-mapping>


1. 如果cascade 不管主控方设置还是被控方设置成all或delete,级联删除时,两端以及中间表的记录都会被删除,通常这样的需要是很少的。

2. 只想删除某一端的记录以及中间的表的关联信息。 这种需求通常是很常见的。这个时候cascade的设置是除与delete有关的任何级联约束。以下是删除心得:

2.1 通过主控方来删除
/** 
* 多对多 主控方删除(可以删除中间表记录) 
*/   
Session session = HibernateSessionFactory.getSession(); 
session.beginTransaction();
   
String cid = "2c2880d12041c65f012041c665180001";
Course course1 = (Course) session.get(Course.class , cid); 
session.delete(course1);
session.getTransaction().commit(); 
session.close();

2.2 通过被控方来删除
/** 
* 多对多 被控方删除(无法删除中间表记录) 
*/   
String id = "402881ee175a2e7c01175a2e7ead0003" ; 
Session session = HibernateSessionFactory.getSession(); 
session.beginTransaction(); 
Teacher t1 = (Teacher) session.get(Teacher.class , id); 
session.delete(t1); 
session.getTransaction().commit(); 
session.close(); 

/** 
* 多对多 被控方删除(可以删除中间表记录)  
*/   
String id = "402881ee175a2e7c01175a2e7ead0003" ; 
Session session = HibernateSessionFactory.getSession(); 
session.beginTransaction(); 
Teacher t1 = (Teacher) session.get(Teacher.class , id);

Set<Course> cs = t1.getCourses(); 
for  (Course c : cs) { 
    c.getTeachers().remove(t1); 
} 
session.delete(t1); 
session.getTransaction().commit(); 
session.close();  


二。映射为两个一对多关系
三个表结构如下:
CREATE TABLE [dbo].[student] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[sno] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[sname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[gender] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[score] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[cid] [bigint] NULL ,
[sid] [bigint] NULL ,
[scgrade] [float] NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[course] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[cno] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]

Student.hbm.xml
<hibernate-mapping>
    <class name="mapping.Student" table="student" schema="dbo" catalog="Student">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="identity" />
        </id>
        <set name="scores" cascade="all" inverse="true"  table="score" >
            <key>
                <column name="sid" not-null="true"  />
            </key>
            <one-to-many class="mapping.Score" />
        </set>
    </class>
</hibernate-mapping>

Score.hbm.xml
<hibernate-mapping>
    <class name="mapping.Score" table="score" schema="dbo" catalog="Student">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="identity" />
        </id>

        <many-to-one name="course" class="mapping.Course" >
            <column name="cid"  />
        </many-to-one>
        <many-to-one name="student" class="mapping.Student" >
            <column name="sid" />
        </many-to-one>
    </class>
</hibernate-mapping>


Course.hbm.xml
<hibernate-mapping>
    <class name="mapping.Course" table="course" schema="dbo" catalog="Student">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="identity" />
        </id>
        <set name="scores" cascade="all" inverse="true"  table="score">
            <key>
                <column name="cid" not-null="true" />
            </key>
            <one-to-many class="mapping.Score" />
        </set>
    </class>
</hibernate-mapping>

/** 
* 一对多 被控方删除(可以删除中间表记录)   学生
*/ 
Long lid = Long.valueOf("19");
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Student student = (Student)session.get(Student.class, lid);
session.delete(student); 
session.getTransaction().commit();
session.close();

/** 
* 一对多 被控方删除(可以删除中间表记录)   课程
*/
Long lid = Long.valueOf("19");
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Course course = (Course)session.get(Course.class, lid);
session.delete(course); 
session.getTransaction().commit();
session.close();

另外从网上收集了一些资料,进行了整理, 附件内容包括一对一,一对多,多对多类型映射及详细说明。希望对学习hibernate的朋友有所帮助。
Hibernate_一对多增删改查数据 上传的资料都是非常经典的,这也是我学习过程中的心得,希望大家能给我指点,也希望大家多上传资料共同学习。千万不要传空文件夹。。。 立即下载

相关推荐

数据可视化—power bi 基础操作汇总

数据来源: https://pan.baidu.com/s/1U_Y7rKfhnSKbLmh4FcUD_Q 提取码: yq5v 目录 基本功能与视图 编辑与查询—修改column案例 建立关联性 新增column与DAX完成总价运算 习题练习1:建立可视化图表 产品销售统计图 column拖曳可视化 1.基本功能与视图 ①基础操作界面 ②获取数据—以打开excel为例 ③数据文件基本视图 可视化形式:柱状图、数据、关联性 2.编辑与查询—修改column ①编辑与查询—数据处理界面 .

weixin_52730784的博客 2683

关于Hibernate的多对多的删除

如果只是想删除两个表之间建立的关系,则只需要在持久层做如下操作:         Session session = HibernateUtils.getCurrentSession();         String hql="from Supplier s where s.s_name=:name";         @SuppressWarnings("rawtypes")        ...

qq_41460161的博客 342

bert-ini:一种基于bert的实体对齐交互模型

本次分享一项来自IJCAI-20的实体对齐工作,该工作提出了一种不同于以往的采用图结构信息进行实体对齐的技术方案,该方案取得了当时的最好效果;不仅如此,模型本身的对齐效率在该项工作中也被考虑,实际工作中非常具备借鉴意义。

qq_33331424的博客 3154

hibernate多对多关系表的搭建和‘增删改查’

众所周知,数据库有三种数据模型,一对一,一对多,多对多,在前面的文章中主要介绍了一对一和一对多的表关系搭建和使用sql语句进行增删改查。使用hibernate框架主要分为三步:创建类创建映射文件添加配置文件。

闲来垂钓碧溪上的博客 633

CANoe的安装教程

CANoe的安装教程

weixin_59090531的博客 1万+

如何通过常规测井曲线识别砂岩、泥岩、碳酸盐岩和煤层

常规测井曲线通过不同岩性的物理性质差异识别砂岩、泥岩、碳酸盐岩和煤层。砂岩表现为低自然伽马(GR)、中等密度(RHOB)和声波时差(DT);泥岩以高GR、高中子(NPHI)和高DT为特征;碳酸盐岩显示低GR、高RHOB和低DT;煤层则具有极低RHOB、极高NPHI和DT的独特组合。综合GR与三孔隙度曲线(RHOB、NPHI、DT)可有效区分岩性,其中密度测井对煤层识别最可靠。电阻率(RT)曲线辅助判断流体性质,但需结合其他参数综合分析。

love code, love life. 2597

Hibernate多对多级联删除的问题

当数据库两个表是多对多关联关系的时候,维护者应该是数据量较少的一方。 即维护者inverse=false,被维护者inverse = true。 级联关系建议都是cascade= save-update。 下面代码中,Project负责维护Employee的更新。 删除维护者的时候可以直接delete。 Transaction tx

Julyraining的博客 3158

微信小程序 - 实现Java微信支付退款功能以及退款流程,微信小程序前端+java后端完整示例源码,微信小程序退款功能详解,小程序订单申请退款和退款回调方法、查询退款等(新版微信支付,详细示例代码)

微信小程序开发-微信支付退款功能以及退款回调方法,微信支付退款API详解,微信小程序支付V3(支付、退款)Java实现微信小程序开发 小程序支付开发-小程序退款功能,微信小程序小程序和公众号 退款功能教程(含申请退款和退款回调,退款回调地址在商户后台配置或者代码自定义)最新版微信小程序支付,退款问题,小程序支付和退款功能详解,小程序申请退款,小程序处理退款,微信小程序支付与退款java,微信小程序退款及回调,JAVA实现微信小程序支付退款功能,退款api调用报错,如何解决退款申请无响应,如何用实现小程序订单

🏆 前端领域优质创作者 4159

Spring整合hibernate 双向多对多级联删除问题

最近在在做一个项目的时候,遇到关于hibernate的双向多对多级联删除的问题,上网搜索关于多对多删除的解释很少,但是双向多对多级联删除的需求也有很多,花了一整天时间才彻底弄明白级联删除的相关细节问题。下面就我个人理解做相关总结。               下面是两个实体类中的多对多的映射关系配置:         注意:下面提到的父方和子方是通过inverse属性来设置的,如

ShiLuoHeroKing的博客 2924

华为OD技术面真题 - Python开发 - 1

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 1719

YOLOv5改进 | 多尺度特征提取 | 结合多样分支块及融合的高级设计(CVPR2021)

YOLOv5改进 | 多尺度特征提取 | 结合多样分支块及融合的高级设计(CVPR2021)

qq_44224801的博客 2068

Hibernate 多对多 删除操作

Hibernate 多对多 删除操作(many-to-many)Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下,以下我们来个简单的多对多关系建立老师Teacher 与 课程Course 是一个多对多的关系,Pojo与XMl配置如下。Pojo/** * Course Entity * see table: t

上班搞IT,下班搞ITF。 1424

【WRF数据准备】制备月尺度静态地理数据:LAI、Fpar、LUCC

【WRF数据准备】制备月尺度静态地理数据:LAI、Fpar、LUCC

WW、forever的博客 803

Hibernate--多对多关系的表达、配置与操作(保存、修改、删除)详解

创建表 创建sys_user、sys_role、sys_user_role三张表: 创建实体 User: public class User { //主键 private Long user_id; private String user_code; private String user_name; private String user_password; private Cha...

吴声子夜歌的博客 739

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Hibernate 多对多 删除操作(many-to-many)续

Hibernate 多对多 删除操作(many-to-many)续 先往数据库里插入一些记录:public void testSave() { Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); // create course Course c1

上班搞IT,下班搞ITF。 2308

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HIbernate--多对多的级联操作(保存、更新、删除)详解

级联操作 多对多的级联操作同一对多和多对一是一样的。如果只保存单独的一方是不可以的,还是需要保存双方的。如果想保存一方就需要设置级联操作。同样需要设置主控方。 创建表 创建sys_user、sys_role、sys_user_role三张表: 创建实体 User: public class User { //主键 private Long user_id; private String u...

吴声子夜歌的博客 1400

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java多对多关联数据操作,hibernate实施多对多关联查询时,关联表数据被删除

hibernate执行多对多关联查询时,关联表数据被删除本帖最后由 binbb521 于 2012-12-04 11:48:29 编辑S2SH框架开发的网站,执行两个多对多关系的表查询时,关联两个表的中间表数据被删除,麻烦各位大牛看一下,很急,解决立马结贴,谢谢了!ZqAdminPermission.hbm.xmlZqAdminModules.hbm.xml根据ID查询ZqAdminPermiss...

weixin_39610353的博客 339

在Spring Data JPA和Hibernate中,实现多表关联的操作(包括一对一、一对多、多对一、多对多的查询、删除、关联插入)实现过程

在Spring Data JPA和Hibernate中,实现多表关联的操作(包括一对一、一对多、多对一、多对多的查询、删除、关联插入)实现过程

weixin_45428910的博客 644

Hibernate多对多删除问题的解决

Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下,以下我们来个简单的多对多关系建立 老师Teacher 与 课程Course 是一个多对多的关系,Pojo与XMl配置如下。 Pojo Java代码 /** *CourseEntity *seetable:tbl_course ...

weixin_30338743的博客 82

Hibernate之多对多

数据库的多对多(点击查看一对多的关联关系) 数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注1:数据库多表联接查询,永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左)/right(右)/full(左右) 主从表:连接条件不成立时,主表记录永远保留,与null匹配 例如三表:A B AB select * from A,B,AB...

TangXS的博客 275

java hibernate 多对多_java – Hibernate多对多删除关系

我有一个hibernate多对多关系的问题:当我从我的集合中删除一个项目时,它不会在我的数据库中删除.我知道有很多类似的问题,但我没有通过阅读来修复我的问题.我已经为它编写了一个JUnit测试用例.我的协会是建筑物和用户之间:@Testpublic void testBuildingManyToMany(){//Create 2 buildingsBuilding building = creat...

weixin_36137509的博客 129

hibernate关联关系(多对多)

1. 数据库的多对多 1.1 数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注1:数据库多表联接查询 永远就是二个表的联接查询 A B C D t1 C t2 D t3 注2:交叉连接 注3:外连接:left(左)/right(右)/full(左右) 主从表:连接条件不成立时,主表记录永远保留,与null匹配 A B AB select...

weixin_45176963的博客 127

Hibernate多对多

Hibernate多对多 数据库的多对多: 数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注:数据库多表联接查询,永远就是二个表的联接查询 hibernate的多对多: hibernate可以直接映射多对多关联关系(看作两个一对多) 多对多关系注意事项:一定要定义一个主控方 讲解下一对多的自联: TreeNode.hbm.xml <?xml v...

weixin_43710113的博客 444
上一篇: hibernate工具类
下一篇: Hibernate多对多删除问题的解决
飞飞的魔毯小窝
博客等级 码龄14年 12粉丝 735原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值