首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate多对多删除有关问题的解决

2012-08-22 
Hibernate多对多删除问题的解决Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问

Hibernate多对多删除问题的解决

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

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

?

Pojo

?????? "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();?
}

?

many-to-many:?
delete 细化到:1,删除关系,也就是删除中间表的记录.(中间表只是表达多对多的关系,和一对多的主外键关系是一致)?
???????????? 2.删除关联方的记录,在多对多中这通常是不应该的.?
多对多的删除操作一般指的是删除多对多的关联关系,cascade="save-update"是合适的.?

双向关联关系要保证关系的双向绑定和双向解除,为了对象关系与数据库关系同步.?

一对多也相同,删除关系变为从表外键=null,只是一对多删除操作通常会删除从表记录.?
none:?
save-update 级联保存.?
delete????? 级联删除.?
all?????? 包含以上两种.?
delete-orphan? 当从集合移除一个对象时,由解除关系变为删除记录的操作.?
all-delete-orphan? 包含以上所有操作.?


对于多对多双向关联的删除操作我所遇到的一个问题是:?
? ConcurrentModificationException异常的避免.利用迭代器,解除双向关系的时候就会抛出.?
? 能够解决,但总是感觉解决方法很差.?

热点排行