您的位置:首页 > 其它

Hibernate级联--cascade,inverse

2009-10-22 00:46 357 查看
级联是什么.我查下百度

把二个以上的设备通过某种方式连接起来,能起到扩容的效果就是级联。

那么,hibernate的级联是什么,,其实就是两个表之间相互的关系,一对一,一对多,多对多三种.通俗一点说,比如我们有两个表,Student表和Class表,这是很典型的一对多的关系...级联能我们做什么呢..我们可以在插入Student的时候自动插入Class,或者我们在插入Class的自动帮我们插入Stduent...这就是级联

hibernate最主要的是那个hbm.xml配置文件,,,和级联相关的属性是cascade和inverse..

cascade表示的是在什么操作需要使用级联.具体的有下面几种

(1)none:在保存,删除或修改当前对象时,不对其附属对象(关联对象)进行级联

操作。它是默认值。

(2)save-update:在保存,更新当前对象时,级联保存,更新附属对象(临时对象,

游离对象)。

(3)delete:在删除当前对象时,级联删除附属对象。

(4)all:所有情况下均进行级联操作,即包含save-update和delete操作。

(5)delete-orphan:删除和当前对象解除关系的附属对象。

inverse=false的side(side其实是指inverse=false所位于的class元素)端有责任维护关系,而inverse=true端无须维护这些关系。

维护关系的意思是,保证关系的正确修改.在更新,创建,删除(读就不用说了,双向引用正是为了方便读而出现)A类或者A表时,此时创建的SQL语句必须有责任保证关系的正确修改。

<例子,一对多>
在一对多关系的时候,我们用到的是两个表,一个是班级表,一个是学生表.这个是很典型的一对多关系..

注意,一对多表的关系在于多的那个表里有一个外键..在这里就是说,学生表里面有一个外键是指向班级表的.这个外键就是两个表的关系..我们说的维护这个关系就是维护这个外键.

我们开始做实验,一对多只有两种情况.一表设置为true或者false..多表是没有对应的inverse属性的.对应到我们这个例子,就是班级表的inverse=false
活着inverse=true

(1)班级表的inverse=true..我们执行插入班级的操作.执行的结果是

Hibernate: insert into clas (cname) values (?)

Hibernate: insert into
student (cid, sname) values (?, ?)

Hibernate: insert into student (cid,
sname) values (?, ?)

我们可以看到,班级表并没有对关系进行维护,也就是说没有对student的外键cid进行维护(如果你没看出来有没维护,看下面的例子,你就可以看到什么叫做对关系进行维护了)

(2)班级表的Inverse=false .我们执行插入班级的操作.结果是

Hibernate: insert into clas (cname) values (?)

Hibernate: insert into
student (cid, sname) values (?, ?)

Hibernate: insert into student (cid,
sname) values (?, ?)

Hibernate: update student set cid=? where
sid=?

Hibernate: update student set cid=? where sid=?

注意,下面两条是关键..就是下面两条操作对关系进行了维护...前面三条的插入操作就不说了,后面两条修改cid的操作,保证了cid的正确性.也就是说,班级表对这个关系进行了维护..这就是
有责任维护关系的正确性....

<例子>
在我们上一节说,有一个学生表,一个老师表.我们设置学生表是true.而老师表是false..这样就说明,老师表有责任维护关系的正确修改,而学生表没有这个责任

.注意,多对多表的关系体现在他们的映射表...也就是说,他们如果没有对应的那个映射表,那么,这两个表是两个单独的表,没有任何关系..所以,我们说的维护关系就是说在维护这个映射表.

那么,我们做个实验,分别进行两种情况.两个都是false,两个都是true,一个false一个true...(我们用插入老师来做实验)

(1)如果两个都设置为true的话,那么表示两个表都不不保证关系的正确修改..结果就是,我们通过插入老师,学生表和老师表都插入了,但是,他们的映射表没有任何数据,这样说明,他们的关系其实是被破坏了.

(2)老师表是false,学生表是true.表示,老师对维护关系负责.我们执行插入老师表的操作,因为老师表对关系负责,所以映射表也执行了插入的操作.

(3)老师表是true ,学生表是false..我们执行插入老师的操作,因为老师对维护关系不负责,所以,映射表也没有任何数据.

(4)两个都是false..很明显,这个的话他们两个都对关系负责,那么映射表也执行插入

总结上面说,最主要的是下面几点

(1)什么叫做关系,一对多里面,多表的那个外键就是两个表的关系,多对多表里面,那个映射表就是两个表的关系

(2)什么叫做负责维护关系的正确性.一对多里面,在执行操作以后又特意对外键进行相应的修改操作,那么就是叫负责两个表关系的正确性.在多对多里面,对映射表进行相应的操作,那么就是叫负责两个表之间关系的正确性.

在很多资料里都说,在一对多关系里,多表没有对性的Inverse属性,其实它默认是false..我觉得是有道理的,因为它本身这个表里面就有一对多关系所在的外键,所以他当然是要对关系进行负责....
http://blog.163.com/jingbo2759/blog/static/98375315200982422824341/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: