hibernate中关系的控制

关于hibernate中inverse和cascade属性的设置

1.明确inverse和cascade的作用
inverse决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用)。
cascade决定是否把对对象的改动反映到数据库中,所以cascade对所有的关联关系都起作用(因为关联关系就是指对象之间的关联关系)。
2.关于inverse=”true”的使用场合
   前面提到inverse只对one-to-amny和many-to-many起作用。
a.在one-to-many关联关系中,一端的对象中含有集合(集合中的元素是关系另一端的对象),所以inverse属性是在一端的配置文件中设置的。如果将一端的inverse设为false,表示由一端来维护关系表,即当插入、删除、更新一端对象时,触发对关系表的维护(one-to-many的关系表就是多端对应的表,该表中包含外键);如果将一端的inverse设为true,表示由多端来维护关系表,即当插入、删除、更新多端对象时,触发对关系表的维护。在one-to-many的关系中,最好将inverse设为”true”,由多端来维护数据,可以减少操作,提高效率。
b.在many-to-many关联关系中,两端对象中都含有集合,所以两端都要设置inverse属性。inverse属性的默认值为false。在多对多关联关系中,关系的两端inverse不能都设为false,即默认的情况是不对的,如果都设为false,在做插入操作时会导致在关系表中插入两次关系。也不能都设为true,如果都设为true,任何操作都不会触发对关系表的操作。
3.双向one-to-many关联关系中,为什么设置inverse=”true”?
设置inverse=”true”,表示由多端来维护数据。如果要一方维护关 系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update 操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。显然这样做的话,会减少很多操作,提高了效率。
注:
      单向one-to-many关联关系中,不可以设置inverse="true",因为被控方的映射文件中没有主控方的信息。
    利用"one-to-many" 和 "many-to-one"实现双向one-to-many关联关系。
4.操作建议
  一般对many-to-one和many-to-many不设置级联,这要看业务逻辑的需要;对one-to-one和one-to-many设置级联。
  many-to-many关联关系中,一端设置inverse=”false”,另一端设置为inverse=”true”。在one-to-many关联关系中,设置inverse=”true”,由多端来维护关系表。

你可能感兴趣的:(hibernate中关系的控制)