hibernate的cascade和inverse

4. hibernate如何根据pojo来更新数据库[@more@] 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
子标记,这两条都适用。 不管是对 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 ,对 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 11 insert SQL 语句为: insert into ADDRESS_SCHOOL(ADDRESS_ID, SCHOOL_ID)
values(?,?)
22 delete SQL 语句为: delete from ADDRESS_SCHOOL
where ADDRESS_ID=? AND SCHOOL_ID=?
33 delete all SQL 语句为: delete from ADDRESS_SCHOOL
where ADDRESS_ID=?
44 update sql 语句为 ————sqlUpdateRowString
update ADDRESS_SCHOOL set ADDRESS_ID=?
where ADDRESS_ID=? AND SCHOOL_ID=?
set 的操作 (1),hibernate 会执行 (11)sqlInsertRowString set 的操作 (2),hibernate 会执行 (22)sqlDeleteRowString

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/249132/viewspace-970737/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/249132/viewspace-970737/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值