`
Brera
  • 浏览: 2519 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

hibernate抓取策略

 
阅读更多

延迟抓取

默认 lazy=true

		<bag name="childCategories" table="CATEGORY" cascade="save-update" inverse="true" lazy="true">
			<key column="PARENT_CATEGORY_ID" />
			<one-to-many class="cascade.Category" />
		</bag>
 
		parentCategory = (Category) session.get(Category.class, 1L);
		parentCategory.getChildCategories();

Hibernate:
    /* load cascade.Category */ select
        category0_.CATEGORY_ID as CATEGORY1_0_0_,
        category0_.CATEGORY_NAME as CATEGORY2_0_0_,
        category0_.PARENT_CATEGORY_ID as PARENT3_0_0_
    from
        CATEGORY category0_
    where
        category0_.CATEGORY_ID=?

		parentCategory = (Category) session.get(Category.class, 1L);
		parentCategory.getChildCategories().size();

 Hibernate:
    /* load cascade.Category */ select
        category0_.CATEGORY_ID as CATEGORY1_0_0_,
        category0_.CATEGORY_NAME as CATEGORY2_0_0_,
        category0_.PARENT_CATEGORY_ID as PARENT3_0_0_
    from
        CATEGORY category0_
    where
        category0_.CATEGORY_ID=?
Hibernate:
    /* load one-to-many cascade.Category.childCategories */ select
        childcateg0_.PARENT_CATEGORY_ID as PARENT3_0_1_,
        childcateg0_.CATEGORY_ID as CATEGORY1_1_,
        childcateg0_.CATEGORY_ID as CATEGORY1_0_0_,
        childcateg0_.CATEGORY_NAME as CATEGORY2_0_0_,
        childcateg0_.PARENT_CATEGORY_ID as PARENT3_0_0_
    from
        CATEGORY childcateg0_
    where
        childcateg0_.PARENT_CATEGORY_ID=?

 

 lazy="extra" 如果调用size(),contains(),isEmpty()集合不在初始化

		<bag name="childCategories" table="CATEGORY" cascade="save-update"
			inverse="true" lazy="extra">
			<key column="PARENT_CATEGORY_ID" />
			<one-to-many class="cascade.Category" />
		</bag>
 
@OneToMany(mappedBy="parentCategory")
	@Cascade({CascadeType.SAVE_UPDATE})
	@org.hibernate.annotations.LazyCollection(LazyCollectionOption.EXTRA)
	private List<Category> childCategories = new ArrayList<Category>();

 lazy="false"禁用代理

<class name="cascade.Category" table="CATEGORY" lazy="false">
 
@org.hibernate.annotations.Proxy(lazy=false)
public class Category implements Serializable {

  FetchType.EAGER提供与lazy='false'一样的保证

	@OneToMany(mappedBy = "parentCategory",fetch=FetchType.EAGER)
	@Cascade({ CascadeType.SAVE_UPDATE })
	private List<Category> childCategories = new ArrayList<Category>();

   FetchType.LAZY

通过拦截延迟加载

如果不想利用实体类的代理,依然想将延迟加载一个关联实体,可以用no-proxy映射这个关联

		<many-to-one name="parentCategory" class="cascade.Category"
			cascade="none" lazy="no-proxy">
			<column name="PARENT_CATEGORY_ID" not-null="false" />
		</many-to-one>
 
@ManyToOne
@JoinColumn(name="SELLER_ID", nullable = false, updatable = false)
@org.hibernate.annotations.LazyToOne(
org.hibernate.annotations.LazyToOneOption.NO_PROXY
)
private User seller;

批量预抓取策略

 

<class name="cascade.Category" table="CATEGORY" batch-size="10">

<bag name="childCategories" table="CATEGORY" cascade="save-update"
			inverse="true" batch-size="10">
 
@org.hibernate.annotations.BatchSize(size=10)
public class Category implements Serializable {

@OneToMany(mappedBy = "parentCategory",fetch=FetchType.LAZY)
	@Cascade({ CascadeType.SAVE_UPDATE })
	@org.hibernate.annotations.BatchSize(size=10)
	private List<Category> childCategories = new ArrayList<Category>();

  子查询预抓取

<bag name="childCategories" table="CATEGORY" cascade="save-update"
			inverse="true" fetch="subselect">
 
	@OneToMany(mappedBy = "parentCategory",fetch=FetchType.LAZY)
	@Cascade({ CascadeType.SAVE_UPDATE })
	@org.hibernate.annotations.Fetch(FetchMode.SUBSELECT)
	private List<Category> childCategories = new ArrayList<Category>();

 通过联接预抓取

<many-to-one name="parentCategory" class="cascade.Category"
			cascade="none" fetch="join">

<bag name="childCategories" table="CATEGORY" cascade="save-update"
			inverse="true" fetch="join">

  fetch="join"禁用了延迟加载,通过联接及时抓取

@OneToMany(mappedBy = "parentCategory",fetch=FetchType.EAGER)
	@Cascade({ CascadeType.SAVE_UPDATE })
	private List<Category> childCategories = new ArrayList<Category>();

 hibernate默认将其作为一个(JOIN)及时抓取

将联接抓取显示的转向一个立即的第二次查询

	@OneToMany(mappedBy = "parentCategory",fetch=FetchType.EAGER)
	@Cascade({ CascadeType.SAVE_UPDATE })
	@org.hibernate.annotations.Fetch(FetchMode.SELECT)
	private List<Category> childCategories = new ArrayList<Category>();

可以通过hibernate.max_fetch_depth配置联接表数量,通常在1~5之间

 

非全局的抓取策略

可以修改hql查询实现抓取策略

List<Item> allItems =
session.createQuery("from Item i left join fetch i.bids").list();

List<Item> allItems =session.createCriteria(Item.class)
.setFetchMode("bids", FetchMode.JOIN).list();

  这两个查询通过out join为所有item实例生成了获取bid的单个select(fetch='join')

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    day36 06-Hibernate抓取策略:set集合上的抓取策略

    今天我们将深入探讨"day36 06-Hibernate抓取策略",特别是针对set集合的抓取策略。在阅读这篇博客文章(链接:https://364232252.iteye.com/blog/2368811)后,我们将了解到如何优化数据加载,以避免N+1查询问题,...

    day36 08-Hibernate抓取策略:批量抓取

    本篇主要关注的是Hibernate的抓取策略,特别是批量抓取技术,这对于提高应用程序性能至关重要。批量抓取能够减少数据库交互次数,从而优化查询效率。 首先,我们要理解什么是抓取策略。在Hibernate中,抓取策略是指...

    day36 07-Hibernate抓取策略:many-to-one上的抓取策略

    今天我们要讨论的是Hibernate框架中的一个关键概念——抓取策略,特别是针对"many-to-one"关系的抓取策略。这篇博客将深入剖析这个主题,帮助你更好地理解和应用Hibernate。 Hibernate是Java领域中最流行的对象关系...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    Hibernate学习笔记

    001 Hibernate 简介(开源 O/R 映射框架) 002 第一个 Hibernate 示例 003 hibernate 主要接口介绍 004 持久对象的生命周期介绍 005 query 接口初步 006 开源 O/R 映射框架内容回顾 ...029 hibernate 抓取策略

    hibernate学习笔记

    Hibernate 学习笔记 Hibernate 学习笔记 1 第一个hibernate项目(hibernate_first) 2 测试实体对象的生命周期(hibernate_session) 3 ...hibernate抓取策略 53 Hibernate最佳实践(Best Practices) 55

    hibernate3数据检索、抓取策略 、 注解的使用

    hibernate3数据检索、抓取策略 、 注解的使用

    Hibernate中的多表查询及抓取策略

    本篇文章主要探讨了Hibernate中的多表查询和抓取策略,这对于理解如何高效地从数据库获取数据至关重要。 1. **Hibernate中的多表查询** Hibernate支持多种多表查询方式,类似于SQL中的连接查询: - **交叉连接*...

    Hibernate提升性能Hibernate提升性能

    本章主要探讨了如何通过不同的抓取策略来提升Hibernate的性能。抓取策略涉及到当应用程序需要处理对象间的关联时,Hibernate如何有效地获取关联数据。 首先,连接抓取(Join fetching)是一种通过在SELECT语句中...

    Hibernate框架 jar 架包 开发详解

    Hibernate 简介 Hibernate 开发流程 Hibernate 配置文件 Hibernate 核心接口和类 Hibernate ORM映射 HQL Hibernate 懒加载机制与抓取策略 Hibernate 缓存 Hibernate 锁机制

    Hibernate实战(第2版)高清

    你将直接深入到Hibernate的富编程模型之中,贯穿映射、查询、抓取策略、事务、会话、缓存以及更多其他内容。书中图文并茂地介绍了数据库设计和优化技术的实践。在本书中,作者详尽介绍了具有Java持久化2.1标准的...

    Hibernate_day04.zip

    在Hibernate Day 04的学习中,我们深入探讨了如何利用Hibernate进行查询操作以及它的抓取策略,这些是理解并有效使用Hibernate的关键部分。 首先,让我们来详细了解一下Hibernate的查询方式。Hibernate提供了一个...

    Hibernate关键知识点大全

    - 抓取策略包括单个对象、集合的懒加载和Eager加载等,影响数据的获取时机。 11. **事务隔离级别** - 事务的隔离级别包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ...

    Hibernate+中文文档

    19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using...

    Hibernate3性能优化 Hibernate_regerence3.12

    有很多人认为Hibernate天生效率比较低,确实,在普遍情况下,需要将执行转换为SQL语句的 Hibernate 的效率低于直接JDBC存取,然而,在经过比较好...Hibernate的优化策略: 1.抓取优化 2.二级缓存 3.批量数据操作 4.杂项

    Hibernate3开发.pdf

    系统学习Hibernate3的开发知识,循序渐进 ... 包括:抓取策略、集合的性能、二级缓存、查询缓存、管理缓存 第七章:基本实现原理 包括:分增删改查的操作说明Hibernate基本的实现原理 第八章:最佳实践

    如何提高hibernate性能

    针对这种情况,优化Hibernate的配置和使用策略至关重要。以下是一些提高Hibernate性能的关键点: 1. **初始化集合**: 当业务层需要为Web层提供完整的数据集合时,确保在Session关闭前调用`Hibernate.initialize()...

    hibernate3.2中文文档(chm格式)

    19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using...

    HibernateAPI中文版.chm

    19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using...

Global site tag (gtag.js) - Google Analytics