这两个属性都用于一多对或者多对多的关系中。而inverse特别是用于双向关系,在单向关系中咱们并不须要。 java
Cascade表明是否执行级联操做,Inverse表明是否由己方维护关系。 spring
Cascade: 数据库
Cascade属性的可能值有 this
all: 全部状况下均进行关联操做,即save-update和delete。
none: 全部状况下均不进行关联操做。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操做。
delete: 在执行delete 时进行关联操做。 spa
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。好比在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。 hibernate
Inverse: code
Inverse属性的可能值是true或者false,默认为false: xml
false表明由己方来维护关系,true表明由对方来维护关系。在一个关系中,只能由一方来维护关系,不然会出问题(解疑中会讲到);同时也必须由一方来维护关系,不然会出现双方互相推卸责任,谁也无论。 对象
一多对的例子: ip
有两个类,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)。
有以下一段代码:
1. 若是cascade="all"且inverse="false"时:
此时能够看到log里面:
2. 若是cascade = "none" 且 inverse = "false":
3. 若是cascade = "all" 且 inverse = "true"
4. 若是cascade = "none" 且 inverse = "true"
能够看到,对于一对多关系,关系应由“多”方来维护(指定“一”方的inverse为true),而且应在“一”方指定相应的级联操做。
多对多:
在多对多关系中,inverse能够为任何一方,没有什么区别。
解疑:
为何在多对多中不能由双方都来维护关系了:由于这样会致使重复更新中间表的可能,报出重复值的错误。
那么如何在多对多的双向关联中使双方都能维护关系:最好让控制关系的那方来更新关系,若是想让另外一方也来维护关系,那么只有在操做这一方的数据时“显式”更新中间表了吧。
注意:
同时注意在双向关联中,对象之间的关联跟上面说起的关系表维护没有关系。一个是对象/java层面的,一个是hibernate数据库层面的。若是你想在更新一方时,也更新另外一方的对象集合,请看下面这段代码:
这是Person类中的一段代码,Person和Event是多对多的双向关联关系,他们在对方类中的集合分别为participants和events。关系表由Person维护,因此对象关系的维护也在Person类中,而不是Event类中。