Hibernate级联--cascade,inverse

级联是什么.我查下百度

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

那么,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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值