Hibernate多对多删除问题的解决
Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下,以下我们来个简单的多对多关系建立
老师Teacher 与 课程Course 是一个多对多的关系,Pojo与XMl配置如下。
?
Pojo
?????? "NAME" VARCHAR2(20) not null,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();?
}
?
many-to-many:?
delete 细化到:1,删除关系,也就是删除中间表的记录.(中间表只是表达多对多的关系,和一对多的主外键关系是一致)?
???????????? 2.删除关联方的记录,在多对多中这通常是不应该的.?
多对多的删除操作一般指的是删除多对多的关联关系,cascade="save-update"是合适的.?
双向关联关系要保证关系的双向绑定和双向解除,为了对象关系与数据库关系同步.?
一对多也相同,删除关系变为从表外键=null,只是一对多删除操作通常会删除从表记录.?
none:?
save-update 级联保存.?
delete????? 级联删除.?
all?????? 包含以上两种.?
delete-orphan? 当从集合移除一个对象时,由解除关系变为删除记录的操作.?
all-delete-orphan? 包含以上所有操作.?
对于多对多双向关联的删除操作我所遇到的一个问题是:?
? ConcurrentModificationException异常的避免.利用迭代器,解除双向关系的时候就会抛出.?
? 能够解决,但总是感觉解决方法很差.?