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,多对多,删除

Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下,以下我们来个简单的多对多关系建立

老师Teacher 与 课程Course 是一个多对多的关系,Pojo与XMl配置如下。

 

Pojo

Java代码
  1. /** 
  2.  * Course Entity 
  3.  * see table: tbl_course 
  4.  */  
  5. package com.leo.domain;  
  6.   
  7. import java.util.HashSet;  
  8. import java.util.Set;  
  9.   
  10. /** 
  11.  * @author superleo 
  12.  *  
  13.  */  
  14. public class Course {  
  15.   
  16.     private String id;  
  17.   
  18.     private String name;  
  19.   
  20.     private Set<Teacher> teachers = new HashSet<Teacher>();  
  21.   
  22.     public String getId() {  
  23.         return id;  
  24.     }  
  25.   
  26.     public void setId(String id) {  
  27.         this.id = id;  
  28.     }  
  29.   
  30.     public String getName() {  
  31.         return name;  
  32.     }  
  33.   
  34.     public void setName(String name) {  
  35.         this.name = name;  
  36.     }  
  37.   
  38.     public Set<Teacher> getTeachers() {  
  39.         return teachers;  
  40.     }  
  41.   
  42.     public void setTeachers(Set<Teacher> teachers) {  
  43.         this.teachers = teachers;  
  44.     }  
  45.   
  46. }  
/**   * Course Entity   * see table: tbl_course   */  package com.leo.domain;    import java.util.HashSet;  import java.util.Set;    /**   * @author superleo   *    */  public class Course {     private String id;     private String name;     private Set<Teacher> teachers = new HashSet<Teacher>();     public String getId() {    return id;   }     public void setId(String id) {    this.id = id;   }     public String getName() {    return name;   }     public void setName(String name) {    this.name = name;   }     public Set<Teacher> getTeachers() {    return teachers;   }     public void setTeachers(Set<Teacher> teachers) {    this.teachers = teachers;   }    }  
Java代码
  1. /** 
  2.  * Teacher Entity 
  3.  * see table: tbl_teacher 
  4.  */  
  5. package com.leo.domain;  
  6.   
  7. import java.util.HashSet;  
  8. import java.util.Set;  
  9.   
  10. /** 
  11.  * @author superleo 
  12.  *  
  13.  */  
  14. public class Teacher {  
  15.   
  16.     private String id;  
  17.   
  18.     private String name;  
  19.   
  20.     private Set<Course> courses = new HashSet<Course>();  
  21.   
  22.     public String getId() {  
  23.         return id;  
  24.     }  
  25.   
  26.     public void setId(String id) {  
  27.         this.id = id;  
  28.     }  
  29.   
  30.     public String getName() {  
  31.         return name;  
  32.     }  
  33.   
  34.     public void setName(String name) {  
  35.         this.name = name;  
  36.     }  
  37.   
  38.     public Set<Course> getCourses() {  
  39.         return courses;  
  40.     }  
  41.   
  42.     public void setCourses(Set<Course> courses) {  
  43.         this.courses = courses;  
  44.     }  
  45.   
  46. }  
/**   * Teacher Entity   * see table: tbl_teacher   */  package com.leo.domain;    import java.util.HashSet;  import java.util.Set;    /**   * @author superleo   *    */  public class Teacher {     private String id;     private String name;     private Set<Course> courses = new HashSet<Course>();     public String getId() {    return id;   }     public void setId(String id) {    this.id = id;   }     public String getName() {    return name;   }     public void setName(String name) {    this.name = name;   }     public Set<Course> getCourses() {    return courses;   }     public void setCourses(Set<Course> courses) {    this.courses = courses;   }    }  

 

配置文件也非常简单:

Xml代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7.     <class name="com.leo.domain.Course" table="tbl_course"  
  8.         batch-size="100" dynamic-insert="true" dynamic-update="true">  
  9.         <id name="id" column="id">  
  10.             <generator class="uuid" />  
  11.         </id>  
  12.         <property name="name" column="name" type="string" />  
  13.   
  14.         <set access="property" lazy="true" inverse="false"  
  15.             cascade="save-update" name="teachers" batch-size="10" fetch="select"  
  16.             table="tbl_teacher_course">  
  17.             <key column="fk_course_id" />  
  18.             <many-to-many class="com.leo.domain.Teacher"  
  19.                 column="fk_teacher_id" />  
  20.         </set>  
  21.   
  22.     </class>  
  23. </hibernate-mapping>  
<?xml version="1.0"?>  <!DOCTYPE hibernate-mapping PUBLIC          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    <hibernate-mapping>   <class name="com.leo.domain.Course" table="tbl_course"    batch-size="100" dynamic-insert="true" dynamic-update="true">    <id name="id" column="id">     <generator class="uuid" />    </id>    <property name="name" column="name" type="string" />      <set access="property" lazy="true" inverse="false"     cascade="save-update" name="teachers" batch-size="10" fetch="select"     table="tbl_teacher_course">     <key column="fk_course_id" />     <many-to-many class="com.leo.domain.Teacher"      column="fk_teacher_id" />    </set>     </class>  </hibernate-mapping>
Xml代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7.     <class name="com.leo.domain.Teacher" table="tbl_teacher"  
  8.         batch-size="100" dynamic-insert="true" dynamic-update="true">  
  9.         <id name="id" column="id">  
  10.             <generator class="uuid" />  
  11.         </id>  
  12.         <property name="name" column="name" type="string" />  
  13.   
  14.         <set access="property" lazy="true" inverse="true"  
  15.             cascade="save-update" name="courses" batch-size="10" fetch="select"  
  16.             table="tbl_teacher_course">  
  17.             <key column="fk_teacher_id" />  
  18.             <many-to-many class="com.leo.domain.Course"  
  19.                 column="fk_course_id" />  
  20.         </set>  
  21.   
  22.     </class>  
  23. </hibernate-mapping>  
<?xml version="1.0"?>  <!DOCTYPE hibernate-mapping PUBLIC          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    <hibernate-mapping>   <class name="com.leo.domain.Teacher" table="tbl_teacher"    batch-size="100" dynamic-insert="true" dynamic-update="true">    <id name="id" column="id">     <generator class="uuid" />    </id>    <property name="name" column="name" type="string" />      <set access="property" lazy="true" inverse="true"     cascade="save-update" name="courses" batch-size="10" fetch="select"     table="tbl_teacher_course">     <key column="fk_teacher_id" />     <many-to-many class="com.leo.domain.Course"      column="fk_course_id" />    </set>     </class>  </hibernate-mapping>

 

先往数据库里插入一些记录:

 

Java代码
  1. public void testSave() {  
  2.         Session session = HibernateSessionFactory.getSession();  
  3.         session.beginTransaction();  
  4.   
  5.         // create course  
  6.         Course c1 = new Course();  
  7.         Course c2 = new Course();  
  8.         c1.setName("C");  
  9.         c2.setName("Java");  
  10.   
  11.         // create teacher  
  12.         Teacher t1 = new Teacher();  
  13.         Teacher t2 = new Teacher();  
  14.         t1.setName("Leo");  
  15.         t2.setName("Rose");  
  16.   
  17.         // create relationship  
  18.         c1.getTeachers().add(t1);  
  19.         c1.getTeachers().add(t2);  
  20.         t1.getCourses().add(c1);  
  21.         t2.getCourses().add(c1);  
  22.   
  23.         /* 因为主控方级联设置为save-update,如果设置为none,则下面被注释的代码需要开启,否则会报错 */  
  24.         //session.save(t1);   
  25.         //session.save(t2);  
  26.         session.save(c1);  
  27.   
  28.         session.getTransaction().commit();  
  29.         session.close();  
  30.     }  
public void testSave() {    Session session = HibernateSessionFactory.getSession();    session.beginTransaction();      // create course    Course c1 = new Course();    Course c2 = new Course();    c1.setName("C");    c2.setName("Java");      // create teacher    Teacher t1 = new Teacher();    Teacher t2 = new Teacher();    t1.setName("Leo");    t2.setName("Rose");      // create relationship    c1.getTeachers().add(t1);    c1.getTeachers().add(t2);    t1.getCourses().add(c1);    t2.getCourses().add(c1);      /* 因为主控方级联设置为save-update,如果设置为none,则下面被注释的代码需要开启,否则会报错 */    //session.save(t1);     //session.save(t2);    session.save(c1);      session.getTransaction().commit();    session.close();   }

 

下面是测试的一些结果:

1. 如果cascade不管主控方设置还是被控方设置成 all, delete等与delete级联删除有关即可,两端以及中间表的记录都会被删除,通常这样的需要是很少的,因此,如果你要这样的情况,只要简单设置成all, delete就可以轻松的将关系以及两端的记录删除的干干净净。

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

  • 如果删除的是主控方,只需要简单的删除这条记录,级联关系以及主控方的记录同时删除,但被控方的记录仍然存在。因此只对主控方的多对多删除是最简单,直接的。代码如下:
    Java代码
    1. /** 
    2.      * 多对多 主控方删除(可以删除中间表记录) 
    3.      */  
    4.     public void testDelete() {  
    5.         String id = "402881ee175f04be01175f04c05d0001";  
    6.         Session session = HibernateSessionFactory.getSession();  
    7.         session.beginTransaction();  
    8.         Course c1 = (Course) session.get(Course.class, id);  
    9.         session.delete(c1);  
    10.         session.getTransaction().commit();  
    11.         session.close();  
    12.     }  
    /**    * 多对多 主控方删除(可以删除中间表记录)    */   public void testDelete() {    String id = "402881ee175f04be01175f04c05d0001";    Session session = HibernateSessionFactory.getSession();    session.beginTransaction();    Course c1 = (Course) session.get(Course.class, id);    session.delete(c1);    session.getTransaction().commit();    session.close();   }
     
  • 如果你这个时候想直接删除被控方,那么很遗憾的告诉你,你只做到了一半,你只是简单的把被控方的记录删除了,关联关系仍然存在中间表里,系统随时会因为你的关联访问报错,代码如下:
    Java代码
    1. /** 
    2.  * 多对多 被控方删除(无法删除中间表记录) 
    3.  */  
    4. public void testDeleteByInverse() {  
    5.     String id = "402881ee175a2e7c01175a2e7ead0003";  
    6.     Session session = HibernateSessionFactory.getSession();  
    7.     session.beginTransaction();  
    8.     Teacher t1 = (Teacher) session.get(Teacher.class, id);  
    9.     session.delete(t1);  
    10.     session.getTransaction().commit();  
    11.     session.close();  
    12. }  
     /**    * 多对多 被控方删除(无法删除中间表记录)    */   public void testDeleteByInverse() {    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();   }
     
  • 如果想既想删除被控方,双想删除关联,请看下面代码:
    Java代码
    1. /** 
    2.  * 多对多 被控方删除(可以删除中间表记录) 
    3.  */  
    4. public void testDeleteByInverse2() {  
    5.     String id = "402881ee175f04be01175f04c06c0002";  
    6.     Session session = HibernateSessionFactory.getSession();  
    7.     session.beginTransaction();  
    8.   
    9.     Teacher t1 = (Teacher) session.get(Teacher.class, id);  
    10.   
    11.     Set<Course> cs = t1.getCourses();  
    12.     for (Course c : cs) {  
    13.         c.getTeachers().remove(t1);  
    14.     }  
    15.   
    16.     session.delete(t1);  
    17.     session.getTransaction().commit();  
    18.     session.close();  
    19. }  
     /**    * 多对多 被控方删除(可以删除中间表记录)    */   public void testDeleteByInverse2() {    String id = "402881ee175f04be01175f04c06c0002";    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();   }
     

完成了。 但如果是Spring+Hiberante下多对多删除,可能会报一个错误,目前的解决办法是把两端的cascade都设置成none. 初步断定可能与事务有关,如果有人遇到了,并知道为什么,希望能留言,先谢谢大家了。

 

注:三个表的表结构

1. tbl_course.sql

 

    create table "SCOTT"."TBL_COURSE"(
        "ID" VARCHAR2(80) not null,
       "NAME" VARCHAR2(20) not null,
        constraint "SYS_C005315" primary key ("ID")
    );

create unique index "SCOTT"."SYS_C005315" on "SCOTT"."TBL_COURSE"("ID");

 

2. tbl_teacher.sql

 


    create table "SCOTT"."TBL_TEACHER"(
        "ID" VARCHAR2(80) not null,
       "NAME" VARCHAR2(20) not null,
        constraint "SYS_C005313" primary key ("ID")
    );

create unique index "SCOTT"."SYS_C005313" on "SCOTT"."TBL_TEACHER"("ID");

 

3.tbl_teacher_course.sql

  create table "SCOTT"."TBL_TEACHER_COURSE"(
        "FK_TEACHER_ID" VARCHAR2(80),
       "FK_COURSE_ID" VARCHAR2(90)
    );

只删除中间表,可以通过以下代码。

/**
* 多对多 通过主控方删除中间表(其余记录都不变)
*/
public void testDeleteByInverse3() {
String id = "402881ee1782dad9011782dadb310001";
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();

Course c1 = (Course) session.get(Course.class, id);
c1.setTeachers(null);

session.getTransaction().commit();
session.close();
}


/**
* 多对多 通过被控方删除中间表(其余记录都不变)
*/
public void testDeleteByInverse4() {
String id = "402881ee1782dbd4011782dbd64a0002";
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.getTransaction().commit();
session.close();
}

Hibernate 多对多 中间表含有其他字段 注解方式实现 阅读详情

相关推荐

ssm多对多整合 学生选课 多对多增删改查

本项目是多对多的项目,在前台使用了jquery,用ajax来进行回显更新,前后台用json进行传值,并且写了模糊和分页。在此声明一下,里面的模糊和分页和一对多的模糊分页是不一样的,大家下载需要认真看一下,这个项目写的逻辑比较清晰,采用逆向工程生成了部分代码,并且配置了懒加载。逻辑清晰,没有bug。压缩包中并且附带了sql文件,可以直接运行跑通,如果有任何问题,欢迎联系本人进行交流探讨。

关于Hibernate的多对多的删除

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

qq_41460161的博客 342

PostGIS 小白入门详细指南

PostGIS 是 PostgreSQL 的一个扩展,它将 PostgreSQL 转变为一个功能强大的空间数据库,使其能够存储、查询和分析地理空间数据。PostGIS 遵循开放地理空间联盟(OGC)的标准,支持各种空间数据类型和操作,如点、线、多边形、缓冲区、空间连接等。存储各种空间数据类型(如几何类型和地理类型)空间索引,提高查询性能丰富的空间函数和操作支持投影和坐标系统转换城市规划与管理环境监测与分析物流与运输优化地图制作与可视化位置服务与导航。

落魄书生的职业学习生涯 1万+

org.hibernate.jdbc.BatchedTooManyRowsAffectedException

Hibernate  的 delete 操作时报错: [2011-08-01 15:16:12.656] http-8089-1                      at org.hibernate.jdbc.Expectations$BasicE

Seven's Rainbow Paradise 9682

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1920

Cass三角网法土方计算优化技巧:如何根据地形特点调整边界采样间距

本文深入探讨了Cass软件中三角网法(DTM法)土方计算的优化技巧,核心在于如何根据地形的复杂程度动态调整边界采样间距。针对平坦、复杂及人工构造物等不同地形特征,提供了具体的间距调整策略与精度验证方法,旨在帮助工程师在计算精度与效率间找到最佳平衡,实现精细化土方计算。

weixin_29294975的博客 525

org.springframework.orm.hibernate3.HibernateSystemException异常处理

org.springframework.orm.hibernate3.HibernateSystemException: Batch update returned unexpected row count from update [0]; actual row count: 2; expected: 1; nested exception is org.hibernate.jdbc.Batche

qq_28303961的博客 5642

DELL SC存储扩容避坑指南:6Gb vs 12Gb扩展柜混插的真相

本文深入解析DELL SC存储扩容中6Gb与12Gb扩展柜混插的核心规则与性能影响。文章指出,从SCOS 7.3版本起允许混插,但整个SAS环路速率将降至最低设备水平,尤其在12Gb控制器上接入6Gb扩展柜会严重拖累性能。指南提供了清晰的兼容性矩阵、实战操作流程及关键避坑清单,帮助管理员安全、高效地完成存储扩容。

weixin_28314575的博客 459

主题:Hibernate多对多删除问题的解决

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

JAVA_HOME 162

【现代人形机器人:从物理建模到大模型驱动的控制与学习】第1章 机器人建模回顾

本章建立读者进行后续控制 / 优化 / 学习工作的数学与计算基础。内容分为三大块:刚体运动学:位姿表示、坐标变换、旋转参数与李代数/李群(指数映射、twist)多关节机构的正/逆运动学:DH 与 POE 两种建模、雅可比矩阵推导、数值/解析逆解方法与奇异性问题约束动力学:拉格朗日公式、牛顿—欧拉递归算法、接触/冲击模型、受约束系统的方程(拉格朗日乘子与互补性条件)每一节同时给出与练习题。假设读者已具备线性代数(矩阵、特征分解、SVD)、多变量微积分与基础力学(牛顿第二定律)知识。

u012133341的博客 185

【脑电信号】脑电信号EEG形态学滤波处理【含Matlab源码 4023期】

脑电信号EEG形态学滤波处理 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 823

主题:Hibernate多对多删除问题的解决(一种方法)

主题:Hibernate多对多删除问题的解决 博客分类:  Hibernate HibernateXMLSQL.netSpring Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下,以下我们来个简单的多对多关系建立 老师Teacher 与 课程Course 是一个多对多的关系,Pojo与XMl配置如...

lvdong5830的专栏 163

【AI大模型:前沿】41、建筑行业大模型创业全指南:从技术突破到成本控制与落地路径

建筑行业大模型是“高门槛、高回报”的长周期赛道,适合有建筑行业资源+AI技术背景的团队切入。数据是基础,场景切割是策略,合规是底线。通过聚焦“设计生成+规范审查”等刚需场景,用“仿真数据+开源模型”降低成本,3-5年内有望成长为行业独角兽。对于中小团队,避开千万级全流程模型的红海,深耕“小而美”的单点工具,同样能实现盈利与快速扩张。关键成功公式建筑AI创业 = 50%数据壁垒构建 + 30%场景精准切入 + 20%成本控制能力。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2115

hibernate 某个对象自身多对多 级联删除

有个类Student,它要自己对自己进行多对多映射 其中Student 类的属性有: public int id; public String name; public String sex; private Set children = new HashSet(); private Set parent = new HashSet();省去getter和setter, 一开始

爱技术爱生活—TAO 3251

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Hibernate多对多的关系映射,详解(代码+图解)与应用 举个栗子,搞的清楚

user_id*//*sys_rolerole_idrole_namevarchar(32) NOT NULL COMMENT ‘角色名称’,role_memovarchar(128) DEFAULT NULL COMMENT ‘备注’,role_id*/

2401_84046895的博客 1191

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Hibernate多对多级联删除

推荐:[url=http://hongfanshu.blogbus.com/]红番薯[/url] [url=http://geiliba.info/]给力吧![/url] [url=http://blog.163.com/zzr_1984/]又一村[/url] [url=http://blog.sina.com.cn/andyzzr]遗失的记忆[/url...

andy_2的专栏 360

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Hibernate常见的20个问题

1问:Hibernate初始化时总是报错:java.lang.NoClassDefFoundErrorHibernate初始化时出现出错代码:java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException答:这是新手常见问题。是因为使用默认设置时,Hibernate文档里指出的Hibernate库不完整,缺少ehcache.j

Happy Winner 945

hibernate 级联删除时候的两种情况 之(一) 删除主表、关系表跟从一并都删除了

文章转自 :http://www.85java.com/thread-2186-1-1.html前阵子,使用Hibernate删除多对多删除的时候遇到了点问题,情况是这样的: A表和B表存在多对多关系,设计表关联时,创建中间表C,定义两个外键字段A_ID和B_ID,分别关联A表主键和B表主键。 在A表对应的hbm文件中,...上面的cascade设定了级联删,本意是想删除A记录时,顺便清除中间表的关联记录,然而并未如此,删除A记录时,不仅删了中间表的记录,连B表中关联的记录也一并被删除了,这样的操作有时是不

天下无双 8172

hibernate 多对多关系维护(inverse属性值的设置) , 级联新增,删除案例

hibernate的多对多 hibernate可以直接映射多对多关联关系(看作两个一对多) . 多对多关系注意事项 1 一定要定义一个主控方 2 多对多删除 .1 主控方直接删除 .2 被控方先通过主控方解除多对多关系,再删除被控方 .3 禁用级联删除 3 关联关系编辑,不需要直接操作桥接表,hibernate的主控方会自动维护 讲解inverse属性; * 总共四种 (false 是控制方 ...

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值