`
llc
  • 浏览: 17175 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate学习笔记——cascade和inverse

阅读更多

习惯用实例说明一切:

    首先我们来看多对一中的单向情况,例子用mother和son,一个mother包含多个son。

    Cascade:

    必然,我们在mother中是有个Set属性的,在son中只有自己的属性,如果在数据库映射中我们不设置cascade属性在操作的时候是会出错了,因为该属性是指:对当前对象做什么操作就对关联对象做什么操作,在我们向数据库中插入数据时,由于没有给出cascade的关联操作,那hibernate就会很茫然,不知道该给关联对象什么操作,所以会出错。

    于是我们在mother一边加上cascade属性,我们只对mother进行保存操作,但是我们发现son的信息也被我们保存进了数据库,那如果我们在son这边设置cascade在mother端不设置呢?你是在做梦么?没见我们在讨论单向吗?在son中是不能设置cascade的,所以你还是老实的在多的一方设置吧。

    Inverse:

    接下来,我们来看下inverse属性,我们将上面的cascade属性去掉,然后在mother一端加上inverse="false",同时进行保存mother的操作,我们发现出错了,出错的原因与什么属性都不加是一样的,于是我们可以得出inverse默认值就为false,那如果把换成true呢?我们惊奇的发现在没有cascade的情况下设置inverse为true系统没出错,但是我们查看数据库却失望的发现:只有mother表中有一条记录,而在son表中没记录,说明我们并没有将两个对象关联起来,所以还是老实的把cascade加上吧!

    我们在mother端加上cascade并设置inverse为false,让他自己去维护关系,我们发现数据正常的被存入了数据库,但是当我们将inverse设置为true,让son去维护关系时,我们发现数据库中也存入了相应的信息,但son中的mother_id(外键)却没有得到值,所以这是悲剧。

    你问我可以在son中设置inverse不?不能,因为他只能存在于集合标签中。

 

    接下来我们来看多对一中的双向情况,仍然用mother和son,一个mother包含多个son,不同的是,这次在son的属性中多了一个mother对象属性。

    Cascade:

    同样我们什么都不设置,系统无情的再次出错。

    于是我们在mother一边设置cascade,恩,数据进去了,很完整!

    那么我们可以在son一边设置吗?我们惊奇的发现在<many-to-one>标签中我们能设置,说明在双向情况下任意一边都能级联操作,但是在保存数据时却出错了,我们可以猜测:Hibernate在保存数据时是先创建唯一的一方,再创建多的一方,因为数据多的一方需要引用唯一方的主键作外键,所以在这样的情况下,我们唯一一方仍然必须加上cascade。

    Inverse:

    我们将上面的cascade属性去掉,然后在mother一端加上inverse="true",在保存mother时我们发现只有mother的数据保存进去了,没有son的数据,所以没有对son进行操作,因为我们没有级联操作,Hibernate不知道在保存mother时该对son做什么操作,所以cascade不能少,加上后我们发现数据就能正常保存了。你问我son中可以写inverse吗?不能,因为他只能存在于集合标签中。

 

结论:为了避免出错,在能写cascade的地方都写上吧,在单向中写inverse是没有意义的,就用默认的就好了,在双向中使用inverse建议交给多的一方维护关系,最后送上国际化语言: cascade 维护的是关系两端对象与对象的级联关系,而 inverse 维护的是关系与对象的关系。

 

注:JAVA代码部分在书写上有许多地方要注意,这个就自己去体会了。以上内容纯原创,肯定会有许多纰漏,也会有些错误,请指正(其实是写昏头了~难的写了~哦哈哈)。

分享到:
评论
1 楼 点虫虫 2009-11-29  
写得很有趣,虽然没有具体代码,但是有几句话说得很深刻,谢谢!!
1.cascade 对当前对象做什么操作就对关联对象做什么操作
2.Hibernate在保存数据时是先创建唯一的一方,再创建多的一方,因为数据多的一方需要引用唯一方的主键作外键,所以在这样的情况下,我们唯一一方仍然必须加上cascade。
3.国际化语言: cascade 维护的是关系两端对象与对象的级联关系,而 inverse 维护的是关系与对象的关系。

相关推荐

Global site tag (gtag.js) - Google Analytics