Hibernate最让人头大的就是对集合的加载形式。
书看了N次了,还是没有真正理解Hibernate。所以下午专门做了下测试,对配置文件的意思加深了认识。
假设有两个表,Photos(一)
--- picture(多)Photo包含picture集合
结论1: HQL代码 > fetch(配置) > lazy
(配置)
结论2: 默认 lazy="true"
结论3: fetch 和 lazy 主要是用来级联查询的, 而 cascade 和
inverse 主要是用来级联插入和修改的
结论4: 如果你是用spring来帮你管理你的session,
并且是自动提交,延迟加载就等于没加载~_~(当然
除非你手动重新打开session然后手动Hibernate.initialize(set);然后关闭session.
结论5: cascade主要是简化了在代码中的级联更新和删除。
j结论6:老爸可以有多个孩子,一个孩子不能有多个老爸,而且老爸说的算,
孩子围着老爸转。
所以Photos老爸要有权力所以
cascade 这个关键子都是送给老爸的, 也就是级联更新,
老爸改姓了,儿子也得跟着改,呵呵。“不然,就没有零花钱咯”。
而Picture儿子整体挨骂,但是还是要维护父子之间良好的关系,对老爸百依百顺,所
以老爸就说,儿子,“关系,由你来维护(inverse="true") ,不然就不给零花钱。呵。”。
<set
name="pictures" inverse="true" cascade="all">
<key>
<column name="photosid" not-null="true"
/>
</key>
<one-to-many
class="girl.domain.Picture" />
</set>
测试代码:
Photos p =
ps.getById(1);
Set<Picture> set = p.getPictures();
for(Picture
pic : set){
System.out.println(pic.getId());
}
配置文件的一部分:
<set name="pictures" inverse="true" cascade="all"
>
<key>
<column name="photosid"
not-null="true" />
</key>
<one-to-many
class="girl.domain.Picture" />
</set>
测试过程会对配置文件不断修改:并且从来不曾手动重新打开session
测试结构:
当配置条件为
lazy=true 一句查询 测试代码中没有调用getPicture() 正常
Hibernate: select photos0_.id as
id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_,
photos0_.name as name0_0_, photos0_.createtime as createtime0_0_,
photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_,
photos0_.uri as uri0_0_ from super.photos photos0_ where
photos0_.id=?
lazy=true 一句查询 有getPicture()
Hibernate: select photos0_.id as
id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as typeid0_0_,
photos0_.name as name0_0_, photos0_.createtime as createtime0_0_,
photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_,
photos0_.uri as uri0_0_ from super.photos photos0_ where
photos0_.id=?
lazy=true 一句查询 有getPicture() 并且访问了里面的元数Picture
且有异常抛出
Hibernate: select photos0_.id as id0_0_, photos0_.userid as
userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_,
photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_,
photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos
photos0_ where photos0_.id=?
lazy="false" 两句查询 肯定没问题,因为全部数据都个查了出来
所以怎么调用都正常
Hibernate: select photos0_.id as id0_0_, photos0_.userid as
userid0_0_, photos0_.typeid as typeid0_0_, photos0_.name as name0_0_,
photos0_.createtime as createtime0_0_, photos0_.description as descript6_0_0_,
photos0_.faceid as faceid0_0_, photos0_.uri as uri0_0_ from super.photos
photos0_ where photos0_.id=?
Hibernate: select pictures0_.photosid as
photosid1_, pictures0_.id as id1_, pictures0_.id as id2_0_, pictures0_.photosid
as photosid2_0_, pictures0_.name as name2_0_, pictures0_.clicked as clicked2_0_,
pictures0_.uploaddate as uploaddate2_0_, pictures0_.size as size2_0_,
pictures0_.description as descript7_2_0_, pictures0_.uri as uri2_0_ from
super.picture pictures0_ where pictures0_.photosid=?
fetch="join" 一句查询 效果 == lazy="false"
呵呵,哪个效率高,我就不知道了。。。。。。。。。。。
Hibernate: select photos0_.id as id0_1_,
photos0_.userid as userid0_1_, photos0_.typeid as typeid0_1_, photos0_.name as
name0_1_, photos0_.createtime as createtime0_1_, photos0_.description as
descript6_0_1_, photos0_.faceid as faceid0_1_, photos0_.uri as uri0_1_,
pictures1_.photosid as photosid3_, pictures1_.id as id3_, pictures1_.id as
id2_0_, pictures1_.photosid as photosid2_0_, pictures1_.name as name2_0_,
pictures1_.clicked as clicked2_0_, pictures1_.uploaddate as uploaddate2_0_,
pictures1_.size as size2_0_, pictures1_.description as descript7_2_0_,
pictures1_.uri as uri2_0_ from super.photos photos0_ left outer join
super.picture pictures1_ on photos0_.id=pictures1_.photosid where
photos0_.id=?
不加fetch="join" 一句查询 没有getPicture() 正常
Hibernate: select
photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as
typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_,
photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_,
photos0_.uri as uri0_0_ from super.photos photos0_ where
photos0_.id=?
不加fetch="join" 一句查询 有getPicture() 正常
Hibernate: select
photos0_.id as id0_0_, photos0_.userid as userid0_0_, photos0_.typeid as
typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as createtime0_0_,
photos0_.description as descript6_0_0_, photos0_.faceid as faceid0_0_,
photos0_.uri as uri0_0_ from super.photos photos0_ where
photos0_.id=?
不加fetch="join" 一句查询 有getPicture() 并且访问里面的元素Picture的ID
有异常抛出
Hibernate: select photos0_.id as id0_0_, photos0_.userid as userid0_0_,
photos0_.typeid as typeid0_0_, photos0_.name as name0_0_, photos0_.createtime as
createtime0_0_, photos0_.description as descript6_0_0_, photos0_.faceid as
faceid0_0_, photos0_.uri as uri0_0_ from super.photos photos0_ where
photos0_.id=?
来个两兵交战 fetch="join" lazy="true" 呵呵 结果,一句查询, 结构正常 所以就当lazy不存在好了。
看来fetch 是老大。、、、、、、、、、、、、、
Hibernate: select photos0_.id as id0_1_,
photos0_.userid as userid0_1_, photos0_.typeid as typeid0_1_, photos0_.name as
name0_1_, photos0_.createtime as createtime0_1_, photos0_.description as
descript6_0_1_, photos0_.faceid as faceid0_1_, photos0_.uri as uri0_1_,
pictures1_.photosid as photosid3_, pictures1_.id as id3_, pictures1_.id as
id2_0_, pictures1_.photosid as photosid2_0_, pictures1_.name as name2_0_,
pictures1_.clicked as clicked2_0_, pictures1_.uploaddate as uploaddate2_0_,
pictures1_.size as size2_0_, pictures1_.description as descript7_2_0_,
pictures1_.uri as uri2_0_ from super.photos photos0_ left outer join
super.picture pictures1_ on photos0_.id=pictures1_.photosid where
photos0_.id=?
相关推荐
"NHibernate Inverse & Cascade"是两个关键概念,对于理解和有效使用NHibernate至关重要。 **Inverse属性** Inverse属性主要用于控制NHibernate如何处理关联对象的持久化。在一对多或多对一的关系中,当一个实体...
在这个主题中,我们关注的是一个使用C语言实现的反插值程序,名为"inverse",它似乎对常规的反插值方法进行了优化,加入了正则化处理,以提高计算效果。 首先,让我们理解什么是反插值。在插值中,我们通常有一个...
在Hibernate中,`Inverse`是一个重要的概念,它涉及到实体之间的关联管理。本文将深入探讨`Inverse`属性,以及它在Hibernate中的作用和应用场景。 一、Hibernate与对象关系映射 Hibernate通过ORM机制将Java对象与...
### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...
在IT行业中,尤其是在Java开发或者使用ORM框架(如Hibernate)时,“inverse=true”是一个非常重要的概念,它涉及到对象关系映射中的数据管理策略。本文将深入解析“inverse=true”的含义,以及它在实际应用中的作用...
**标题:** "Inverse Problem Theory and Methods for Model Parameter Estimation"(反演问题理论与模型参数估计方法) 此书名表明了该书的核心内容是关于反演问题的理论及其在模型参数估计中的应用方法。反演问题...
This textbook evolved from a course in geophysical inverse methods taught during the past two decades at New Mexico Tech, first by Rick Aster and, subsequently, jointly between Rick Aster and Brian ...
在科学和工程领域中,参数估计与反问题(Parameter Estimation and Inverse Problems)是解决实际问题的重要工具之一。这类问题通常涉及未知参数或状态的确定,这些参数或状态无法直接测量,但可以通过观察到的数据...
Inverse Synthetic Aperture Radar Imaging----Victor C. Chen 第一章 ISAR成像介绍 第二章 ISAR成像基本原理 第三章 ISAR成像 第四章 ISAR运动补偿 第五章 ISAR自聚焦方法 第六章 ISAR成像中的信号处理问题 第七章...
在IT领域,"inverse"和"cascade"是两个常见的概念,尤其在数据库设计、软件工程以及数据处理中。这两个术语通常与关系型数据库中的外键约束、对象关系映射(ORM)工具,以及某些编程框架的特性相关。下面将详细阐述这...
"IND Inverse - MetaTrader 4 脚本.zip" 是一个包含 MetaTrader 4 (MT4) 平台使用的自定义指标的压缩文件。这个指标被称为 "IND Inverse Indicator",它专为外汇交易者设计,帮助他们在市场分析中做出更明智的决策。...
本文将深入探讨Hibernate中的一对多关系,并重点解析`inverse`属性的作用及其应用。 一对多关系是数据库设计中常见的关联类型,例如一个用户可以拥有多个订单,一个班级可以包含多个学生等。在Hibernate中,通过...
逆合成孔径雷达(ISAR,Inverse Synthetic Aperture Radar)是一种能够生成目标高分辨率图像的技术,广泛应用于军事、航空以及海洋监控等领域。ISARLAB是一款由澳大利亚国防科学技术组织(DSTO)开发的计算机程序,...
在Hibernate这个强大的对象关系映射(ORM)框架中,`inverse`属性是一个非常重要的概念,它主要用于管理关联关系的维护责任。在这个例子中,我们将会深入理解`inverse`属性的作用,并通过一个简单的测试案例——`...
"A Qualitative Approach to Inverse Scattering Theory" 这本书通过定性方法探讨了逆散射理论,定性方法通常强调于从物理现象中得到定性的结论,而不完全依赖精确的数学表达式。这种方法有助于理解逆散射问题的深层...
"Inverse_Modified" 指的可能是对标准逆运动学算法的一种改进或调整,以适应特定的机器人模型或优化性能。 MATLAB Robotic Toolbox 是一个强大的工具包,提供了各种用于机器人建模、仿真和控制的函数和类。它包含了...