这两个属性都用于一多对或者多对多的关系中。而inverse特别是用于双向关系,在单向关系中我们并不需要。
Cascade代表是否执行级联操作,Inverse代表是否由己方维护关系。
Cascade:
Cascade属性的可能值有
all:所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
Inverse:
Inverse属性的可能值是true或者false,默认为false:
false代表由己方来维护关系,true代表由对方来维护关系。在一个关系中,只能由一方来维护关系,否则会出问题(解疑中会讲到);同时也必须由一方来维护关系,否则会出现双方互相推卸责任,谁也不管。
一多对的例子:
有两个类,Father和Child,是一对多的关系。下面这段hbm配置是从Father.hbm.xml中摘取的。
<set name="children" lazy="true" cascade="all" inverse="true"> <key column="fatherid"/> <one-to-many class="my.home.Child"/></set>
我们知道cascade和inverse的值对会有四种组合的可能(在此仅先假定cascade值为none或all)。
有如下一段代码:
- FatherDaofatherDao=newFatherDao();
-
- Fatherfather=newFather("David");
- Childchild1=newChild("DavidJuniorOne");
- Childchild2=newChild("DavidJuniorTwo");
-
- father.add(child1);
- father.add(child2);
-
- fatherDao.save(father);
1. 如果cascade="all"且inverse="false"时:
此时可以看到log里面:
-
//执行对father的插入
- Hibernate:insertintofather(name)values(?)
-
-
//cascade='all',所以进行级联操作
- Hibernate:insertintochild(name,fatherid)values(?,?)
- Hibernate:insertintochild(name,fatherid)values(?,?)
-
-
//inverse='false',由father来维护关系(可以看到这些操作是多余的)
- Hibernate:updatechildsetfatherid=?whereID=?
- Hibernate:updatechildsetfatherid=?whereID=?
2. 如果cascade = "none" 且 inverse = "false":
-
//执行对father的插入
- Hibernate:insertintofather(name)values(?)
-
-
//inverse='false',所以更新关系
- Hibernate:updatechildsetfatherid=?whereID=?
-
-
//但由于cascade='none',child并未插入数据库,导致如下exception
- org.springframework.dao.InvalidDataAccessApiUsageException:objectreferencesanunsavedtransientinstance
3. 如果cascade = "all" 且 inverse = "true"
-
//执行对father的插入
- Hibernate:insertintofather(name)values(?)
-
-
//cascade='all',执行对child的插入
- Hibernate:insertintochild(name,fatherid)values(?,?)
- Hibernate:insertintochild(name,fatherid)values(?,?)
-
-
//但由于inverse='true',所以未有对关系的维护。但由于一对多的关系中,关系本身在“多”方的表中。所以,无需更新
- 关系。
4. 如果cascade = "none" 且 inverse = "true"
-
//只执行对father的插入
- Hibernate:insertintofather(name)values(?)
可以看到,对于一对多关系,关系应由“多”方来维护(指定“一”方的inverse为true),并且应在“一”方指定相应的级联操作。
多对多:
在多对多关系中,inverse可以为任何一方,没有什么区别。
解疑:
为什么在多对多中不能由双方都来维护关系了:因为这样会导致重复更新中间表的可能,报出重复值的错误。
那么如何在多对多的双向关联中使双方都能维护关系:最好让控制关系的那方来更新关系,如果想让另一方也来维护关系,那么只有在操作这一方的数据时“显式”更新中间表了吧
分享到:
相关推荐
大神Roman Lygin写的,介绍Opencascade拓扑结构实现与几何描述的文章,相当经典,论述深入,是难得的好文章。
Open CASCADE Technology(简称Open CASCADE或OCCT)是一个开源的3D建模和CAD软件开发平台,主要用于构建基于几何模型的应用程序。它提供了丰富的API,支持多种几何数据结构、建模算法以及图形显示功能。C#版本的...
94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...
在这个特定的项目中,“openCV人脸跟踪小项目——打开摄像头标出人脸位置并跟踪”,我们将会探讨如何使用OpenCV实现人脸检测和跟踪。这个项目包含了以下几个关键知识点: 1. **人脸检测**:OpenCV中的人脸检测主要...
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它包含了大量的图像处理和计算机视觉的算法。在本主题中,我们关注的是OpenCV中的物体识别功能,特别是使用XML文件进行特征描述和分类。 ...
在JavaScript开发中,特别是在前端交互设计中,这种组件非常常见,能够帮助用户通过下拉选项来筛选和导航数据。 ### 1. jQuery Casecader 的核心功能 - **多级联动**:此组件支持多级关联的下拉菜单,用户在选择一...
目标检测经典论文15篇,包括rcnn系列及yolo系列...具体论文:yolov1, yolov2, yolov3, yolov4, RCNN, Fast RCNN, Faster RCNN, Mask RCNN, Casecade RCNN, SSD, VGG, OverFeat, FPN, SPP NET, R-FCN . 方便大家学习。