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 对
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/