天天看点

Hibernate入门学习【四】cascade与inverse

cascade与inverse

作用

  • cascade用于联级操作,在Hibernate中持久化一个临时对象时,默认情况下不会自动持久化所关联的其他临时对象,而是会抛出TransientObjectException。如果设定many-to-one元素的cascade属性为save-update的话,可实现自动持久化所关联的对象,相应的设置delete可以联级删除。
  • inverse可以译为是否放弃维护关联关系,作用是在hibernate中是通过inverse的设置来决定是由谁来维护表和表之间的关系的。

cascade

cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan ;

  • all : 所有情况下均进行关联操作。
  • none:所有情况下均不进行关联操作。这是默认值。
  • save-update:在执行save/update/saveOrUpdate时进行关联操作。
  • delete:在执行delete时进行关联操作。
  • delete-orphan: 当save/update/saveOrUpdate时,相当于save-update ;当删除操作时,(表结构没有父子关系时)相当于delete ;(有父子结构关系时,当两者解除关系,附表成为孤儿,删掉该孤儿,主表仍存在哦)

在一对多或者多对多的关系中,一般在cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除,一般而言单向关联把cascade加在主表(举个例子,客户与订单,删掉客户相应订单一定都删除了,但是我们不希望删除了一个订单却把客户都删除,当然也可以根据自己的需要:操作哪一方就在哪一方文件里面配置),双向关联双方都要在映射文件中配置。

注意事项:级联增加必须外键字段设置为空.

对于联级增加执行过程

  • 插入主键表的主键
  • 插入外键表的数据
  • 在将主键表的主键值更新到外键键字段。

若是不设置为null,则会在第二步抛空异常。

inverese

实际上inverse属性决定了是否对set的改动反映到数据库中去,为了维护数据的一致性而存在。默认情况下inverse属性的值为“false”。

双向关联中双方都(默认)设置 inverse=false的话,必会导致双方都重复更新同一个关系,所以会产生多余的SQL语句,但是如果双方都设立inverse=true的话,双方都不维护关系的更新。

一对多的关系中是默认了让多的一方维护关系设置inverse=false,一的一方为inverse=true;一般是在双向、外键关系中才设置inverse的值。

inverse也会影响联级关系

若是己方维护关系,对方放弃维护那么对方设置的联级关系将会失效,反之亦然。

区别

  • cascade描述的是对象与对象之间的关系,inverse定义的是关系和对象的级联关系。

    inverse属性用于指示本方是否参与维护关系,设为true时不维护,设为false时维护

  • cascade对关系标记都有效

    inverse只对set+one-to-many(或many-to-many)有效,对many-to-one, one-to-one无效。

  • cascade对集合对象中的一个一个元素起作用,如果集合为空,那么cascade不会引发关联操作。inverse对集合对象整体起作用,

继续阅读