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/
把二个以上的设备通过某种方式连接起来,能起到扩容的效果就是级联。
那么,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/
相关文章推荐
- Hibernate学习---第十六节:cascade(级联)和inverse关系详解
- hibernate 级联(cascade和inverse)
- hibernate之级联cascade和关系维持inverse
- hibernate之级联cascade和关系维持inverse
- hibernate级联(cascade和inverse)
- hibernate 级联(cascade和inverse)
- hibernate中关系操作(inverse)和级联操作(cascade)详解
- Hibernate 级联关系说明 - 关于cascade和inverse的用法
- (7) hibernate之级联cascade和关系维持inverse
- hibernate(六) cascade(级联)和inverse关系详解
- hibernate之级联cascade和关系维持inverse
- hibernate笔记--cascade级联以及inverse属性
- Hibernate 级联操作cascade及inverse
- Hibernate 级联关系说明 - 关于cascade和inverse的用法
- Hibernate 级联关系说明 - 关于cascade和inverse的用法
- Hibernate配置级联的一些问题及cascade与inverse的详解
- hibernate之级联cascade和关系维持inverse
- Hibernate级联操作和载入机制(二) cascade and fetch
- Hibernate中cascade与inverse属性详解 ,很经典!!!
- Hibernate之中inverse与cascade的异同