技术中心

这里象征着我们的态度和能力

>Hibernate中inverse与cascade作用
发布者:中国IT实验室    信息来源:中国IT实验室    发布时间:2012-01-09      浏览次数:6477
分享到:

新浪微博

腾讯微博

QQ空间

豆瓣网

QQ好友

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  ?4. hibernate如何根据pojo来更新数据库

  4.0 在commit/flush之前,hibernate不会对pojo对象作神秘的处理。

  4.0.1 在select查询出pojo时,hibernate根据“字段--属性”的对应关系,用字段的值填充pojo的属性;

  然后根据“关系标记”生成sql语句从relationTable中查询出满足条件的relationPojo,并把这些relatinPojo

  放到“关系属性”中。这个过程是机械的。

  4.0.2 在pojo对象被查出来后,到commit(或flush)之前,它将是一个普通的java对象,hibernate不会做额外的手脚。

  比如,不会限制你设置一个属性的值为null或其它任何值

  在集合类Set的add(object)操作时, 不会改变object的值,不会检查参数object是否是一个pojo对象

  设置mainPojo的一个“桥属性”的值,不会自动设置relationPojo的对应的“桥属性”的值。

  执行session.delete(pojo)时,pojo本身没有变化,他的属性值也没有变化。

  执行session.save(pojo)时,如果pojo的id不是hibernate或数据库生成,则它的值没有变化。

  如果pojo的id是hibernate或数据库生成,则hibernate会把id给pojo设上去。

  extend: 对lazy=true的set,hibernate在进行set的操作(调用java.util.Set中声明的方法)时

  会先inialize这个set,仅此而已。而inialize仅仅是从数据库中捞出set的数据。

  如果一个set已经被inialize了,那么对它进行的操作就是java.util.Set接口中定义的语义。

  另外,如果id由hibernate来生成,那么在save(pojo)时,hibernate会改变该pojo,会设置它的id,这

  可能改变该pojo的hashCode,详细地讨论见帖《》

  mapping文件中标记的某些属性及pojo对象的操作会对数据库操作产生影响,这些影响都是在commit时才会起作用。

  而在commit前pojo的状态不受它们的影响。

  不过,待commit之时,将由hibernate完全掌控,它好像知道pojo对象从创建到commit这中间的所有变化。

  4.01. 关联更新

  "关系标记"对应的属性是一个pojo或一个pojo的集合,修改“关系属性”的值能会导致更新mainTable表,也可能会更新relationTable表。

  这种更新暂叫“关联更新”。

  4.1.inverse属性的作用(假定没有设置cascade属性)

  4.1.1 “只有集合标记(set/map/list/array/bag)才有inverse属性”。

  ――――不妨以标记set为例,具体为“一个地区(Address表)的学校(School表)” -- address.schoolSet。

  4.1.2 “set的inverse属性决定是否把对set的改动反映到数据库中去。

  inverse=false――――反映;inverse=true――――不反映”

  inverse属性默认为false

  对<one-to-many>和<many-to-many>子标记,这两条都适用。

  不管是对set做什么操作,4.1.2都适用。

  4.1.3当inverse=false时,hibernate如何将对set的改动反映到数据库中:

  对set的操作主要有:(1)新增元素 address.getSchoolSet().add(oneSchool);

  (2)删除元素 address.getSchoolSet().remove(oneSchool);

  (3)删除set address.setSchoolSet(null);

  (4)设新set address.setSchoolSet( newSchoolSet);

  (5)转移set otherSchoolSet = otherAddress.getSchoolSet();

  otherAddress.setSchoolSet(null);

  address.setSchoolSet(otherSchoolSet);

  (6)改变set中元素的属性的值 如果是改变key属性,这会导致异常

  如果改变的是普通的属性,则hibernate认为set没有变化(在后面可以看出缘由)。

  所以这种情形不予考虑。

  改变set后,hibernate对数据库的操作根据是<one-to-many>关系还是<many-to-many>关系而有不同。

  对one-to-many,对school set的改动,会改变表SCHOOL中的数据:

  #SCHOOL_ID是school表的主键,SCHOOL_ADDRESS是school表中的地址栏位

  #表School的外键为SCHOOL_ADDRESS,它对应表Address的主键ADDRESS_ID

  (11)insert oneSchool―――― sqlInsertRowString:

  update SCHOOL set SCHOOL_ADDRESS=? where SCHOOL_ID=?

  (仅仅update foreign-key的值。)

  (22)delete oneSchool―――― sqlDeleteRowString:

  update SCHOOL set SCHOOL_ADDRESS=null where SCHOOL_ID=?

  (很奇怪,把foreign-key设置为null不知道有什么实际意义?)

  (33)delete 属于某一address的所有school ――――sqlDeleteString:

  update SCHOOL set SCHOOL_ADDRESS=null where SCHOOL_ADDRESS=?

  (44)update ――――sqlUpdateRowString:"", no need

  对many-to-many,对school set的改动,会改变关系表ADDRESS_SCHOOL中的数据:

  #“地区――――学校”的关系为多对多的关系有点牵强,只是为了方便与上面的one-to-many作比较

  #假设有一个关系表ADDRESS_SCHOOL,有两个字段ADDRESS_ID, SCHOOL_ID,

  #这两个字段分别对应ADDRESS和SCHOOL两表的key

[1] [2] [3] 下一页

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730
Baidu
map