从网上copy 一篇文章
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") ,不然就不给零花钱。呵。”。 (这个比喻还真TMD,有意思)
<key>
<column name="photosid" not-null="true">
</column>
<one-to-many class="girl.domain.Picture">
</one-to-many>
测试代码:
Photos p = ps.getById(1);
Set
<picture> set = p.getPictures();
for(Picture pic : set){
System.out.println(pic.getId());
}
配置文件的一部分:
<key>
<column name="photosid" not-null="true">
</column>
<one-to-many class="girl.domain.Picture">
</one-to-many>
测试过程会对配置文件不断修改:并且从来不曾手动重新打开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=?</key></picture>
</key>
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=?
分享到:
相关推荐
根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...
<set name="students" inverse="true" cascade="all" fetch="subselect"> ``` #### 五、批量处理与性能优化 - **Batch Size**: Hibernate支持批量处理,可以通过设置`batch_size`属性来控制批量加载的数量...
@OneToMany(mappedBy = "class", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Student> students; // getters & setters } @Entity public class Student { @Id private Long id; @...
这通过 `cascade` 参数在 `@OneToMany` 和 `@ManyToOne` 注解中配置。 7. **懒加载与立即加载 (Lazy Loading vs Eager Loading)** Hibernate 提供了两种加载策略:懒加载(默认)只在需要时加载关联数据,而立即...
- **一对多**:在映射文件中,通过 `<set>` 标签定义一对多关系,并可通过 `inverse`、`cascade`、`lazy` 和 `fetch` 控制行为。 - **多对一**:通过 `<many-to-one>` 标签定义,可设置 `fetch` 和 `cascade` 属性。...
在Hibernate中,可以通过@OneToOne注解来定义,可以是外键约束或主键共享,需要配置fetch属性来决定何时加载关联对象,比如LAZY或EAGER。 2. **一对多关联(OneToMany)**:一个实体可以与多个其他实体关联。这通常...
在多对多映射中,这两个标签用于定义关系的一端,它们包含属性如inverse(反向),cascade(级联操作),fetch(加载策略)等。 4. **中间表与关联表**: 在多对多关系中,通常需要一个中间表来存储两个实体的主键,...
4. **fetch策略**:通过`fetch`属性可以指定加载关联的方式,如`FetchType.LAZY`(懒加载)和`FetchType.EAGER`(立即加载)。默认情况下,一对多关系是懒加载的,以避免不必要的性能开销。 5. **级联操作**:通过`...
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY) private Set<Order> orders; ``` 这样,只有在真正访问`orders`集合时,Hibernate才会去数据库查询订单。 ### 5. 级联操作 通过设置`CascadeType`,可以...
- **属性**: `lazy=false`表示被动方的记录由Hibernate负责加载,存储在主控方的集合中。 - **示例**: - `java.util.Set` 或 `net.sf.hibernate.collection.Bag` 类型的集合。 #### 九、双向关联管理 - **inverse...
- **懒加载与瞬时加载**:可以通过`lazy="true"`(默认)或`fetch="LAZY"`(注解中为`@OneToMany(fetch = FetchType.LAZY)`)实现懒加载,以提高性能,避免一次性加载大量数据。 - **级联操作**:通过`cascade`属性...
3. `fetch`属性:用于指定关联数据的加载策略,如`EAGER`(立即加载)或`LAZY`(延迟加载)。 4. 外键约束:在数据库中,可以设置外键约束以确保数据一致性,但不是必须的,Hibernate可以通过程序逻辑实现数据一致性...
- **XML配置**:在`<one-to-many>`元素下配置,`<set>`或`<list>`等集合类型用于表示多方,`inverse="true"`表示关联维护在多方。 3. **双向关联** - 双向关联意味着两个实体都持有对方的引用,使得可以从任一侧...
通过`@OneToMany`注解来配置,可以设置`fetch`策略(如LAZY或EAGER),以及`cascade`属性来决定操作的级联性。例如,一个部门可以有多个员工,Department实体中有一个Employee列表。 3. **多对一映射(Many-to-One...
- **`cascade`**:级联选项,例如`save-update`、`delete`等。 - **`inverse`**:指定该关联是否为可逆的,默认为`false`。 - **`fetch`**:加载策略,默认为`join`。 - **`order-by`**:指定排序规则。 - **`lazy`*...
另外,使用`@LazyCollection(LazyCollectionOption.EXTRA)`或`@OneToMany(mappedBy ..., fetch = FetchType.LAZY)`可以实现懒加载,只在需要时加载子对象集合,减少内存消耗。 **六、总结** 理解并熟练掌握...
6. **fetch**:这个属性用于控制集合的加载策略,如"EAGER"(立即加载)和"LAZY"(延迟加载)。默认情况下,Hibernate采用懒加载,只在真正需要集合时才去数据库获取数据,以提高性能。 在`s2sh_relation13_...
- `fetch`:决定如何加载关联数据,`FetchType.LAZY`表示延迟加载,`FetchType.EAGER`表示立即加载。 **多对一关系详解:** 与一对多相反,多对一关系是多个子类实例指向一个父类实例。在上面的用户和订单例子中,...
<set name="orders" table="orders" inverse="true" lazy="true" cascade="all"> ``` 而在`Order`的映射文件中: ```xml ``` **示例应用** 为了更好地理解,我们可以创建一个简单的示例。首先,创建`...
这里的`inverse="true"`表示该端是被管理端,`cascade="all"`表示级联操作,意味着用户对象的任何更改(包括删除)都会影响到关联的订单。 在Order类中,我们需要添加一个User类型的属性,并在`Order.hbm.xml`映射...