`
silentJesse
  • 浏览: 107819 次
  • 性别: Icon_minigender_1
  • 来自: 福建厦门
社区版块
存档分类
最新评论

session.load()的延迟加载及缓存

阅读更多
1.执行load()时,先从Session查找当前的对象是否存在,如果不存在,则从数据库中去查询,如果不存在这条记录,则扔异常;
/**执行get()的时候,不论Session中是否存在当前对象,直接从数据库中去查询,如果不存在,则返回null。**/

2.当前的对象如果不存在时,那么需要到数据库去查询
当你调用load()方法时,事实上他可能并没有真正的去查询数据库,那么要如何马上让他去查询呢
有两种办法:
第一种是:调用完load方法时把马上使用所加载的对象(看不懂的话先看第二种)
第二种是:只要把相对应的对象的配置文件中的lazy设置为false;
这就是hibernate的延迟加载机制(lazy),如果把lazy设置为false,则不使用延迟加载;如果设置为true则使用延迟加载,只有使用到所加载的对象时才会去查询
例如:
有一个类他的配置文件为:
<hibernate-mapping>
    <class name="Events" table="events" catalog="hibernate" lazy="true" >
        <id name="eventId" type="java.lang.Integer">
            <column name="EVENT_ID" />
            <generator class="native" />
        </id>
        <!-- 其他配置信息 -->
    </class>
</hibernate-mapping>



第一次调用load的代码为:
//把hibernate.cfg.xml中添加
//<property name="show_sql">true</property>
//也就是当服务器去操作数据库时输出所对应的sql
 Events anEvent = (Events) session.load(Events.class, eventId);
//事实上这个时候输出并没有真正的去查询数据库

//请看一下配置:
//<class name="Events" table="events" catalog="hibernate" lazy="true" >
//所对应的元素的lazy被设置为true了
//你把lazy设置为false,可以发现调用完上面的这行代码时
//马上就输出了所对应的sql
//那当lazy为true时,load()要延迟到什么时候才去加载数据(查询数据库)呢
//调用完load()之后,只要使用了该对象时就会去加载数据(查询数据库)
//也同时会把sql输出来了,例如:System.out.println(anEnvent);


假如上面的的Envents类里面有一个Set集合
代码为:
package hibernate.hibernate.event;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Events implements java.io.Serializable {
	// Fields
	private Set persons = new HashSet();
	// Constructors

	/** default constructor */
	public Events() {
	}

	public Set getPersons() {
		return persons;
	}

	public void setPersons(Set persons) {
		this.persons = persons;
	}

}

所对应的配置为
<hibernate-mapping>
    <class name="hibernate.hibernate.event.Events" table="events" catalog="hibernate" lazy="false" >
        <id name="eventId" type="java.lang.Integer">
            <column name="EVENT_ID" />
            <generator class="native" />
        </id>
       <!--其他配置信息-->        
       <set name="persons" table="person_event" catalog="hibernate" inverse="true" lazy="false">
        	<key column="EVENT_ID"></key>
        	<many-to-many column="PERSON_ID" class="hibernate.hibernate.person.Person"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

//此时如何不调用EventsObj.getPersons();
//或者不使用persons这个集合的属性
//session.load(anEvent);也是不会加载persons这个集合的
//请看配置<set name="persons" table="person_event" catalog="hibernate" inverse="true" lazy="false">
//其中的lazy也是为false,所以将设置为true将不会延迟加载
//或者马上就使用这个集合

分享到:
评论

相关推荐

    hibernate 延迟加载.docx

    延迟加载的生效时间与`Session`的生命周期相同,一旦`Session`关闭,延迟加载就失效。因此,需要注意在合适的时机关闭`Session`,以防止在`Session`关闭后尝试访问延迟加载的关联对象导致异常。 **配置延迟加载策略...

    session的get与load比较

    此时Hibernate只会在`sess.load()`方法中检查Session缓存,如果没有找到对应的实体对象,它并不会立即执行SQL查询。只有当访问`tfag2`的某个属性或方法时,Hibernate才会真正执行SQL查询。 ##### 3. 懒加载支持 - *...

    Hiberbate 3延迟加载(Lazy)介绍

    #### 二、延迟加载的作用及原理 延迟加载的核心思想是在真正需要数据的时候才进行加载,而不是在一开始就加载所有相关的数据。这样可以避免不必要的数据库查询,减少内存消耗,提高应用性能。 当一个实体被加载时...

    Hibernate延迟加载

    但与实体和集合的延迟加载不同,属性延迟加载通常需要配合二级缓存来实现,因为它需要在不加载整个对象的情况下,单独加载或更新某个属性。 总的来说,延迟加载策略有效地减少了对数据库的访问频率,提高了应用程序...

    hibernate的延迟检索在轻量级J2EE框架中的应用

    - **缓存策略**:结合Hibernate的一级缓存和二级缓存,可以进一步提升延迟加载的效果。通过适当的缓存策略,可以避免频繁的数据库查询,从而提高系统的整体性能。 - **错误处理**:需要注意的是,延迟加载可能会导致...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    这是因为`load`方法假设给定的ID肯定在数据库中存在,它采用延迟加载策略,先返回代理对象,当尝试访问对象属性时才会真正去数据库查询。如果此时数据库中无记录,则抛出异常。 - 相反,`get`方法在找不到对应记录...

    Hibernate之数据加载方式

    1. **单个对象加载(Single Entity Loading)**:通过`Session.get()`或`Session.load()`方法加载单个对象,前者会立即从数据库中取数据,后者创建代理对象,数据在第一次访问时加载。 2. **集合加载(Collection ...

    Hibernate中get()和load()的区别.docx

    - `load()`方法在延迟加载的场景下更优,只有在真正需要数据时才执行SQL,减少不必要的数据库交互。 总结来说,`get()`和`load()`的主要差异在于执行时机和异常处理。`get()`直接查询数据库并返回实际对象,适合对...

    Hibernate中Session.get()方法和load()方法的详细比较

    这就是我们常说的load在默认情况下支持延迟加载(lazy)。 从查询数据库的角度看,get()方法和load()方法也存在着区别。如果查询不到数据,get()方法返回null,不会报错,而load()方法则报错...

    hibernateCRUD

    3.延迟加载(Lazy Loading):对于大对象或关联对象,可采用延迟加载策略,提高程序运行效率。 4. 避免N+1查询问题:在执行一对多或多对多查询时,注意优化避免过多的数据库查询。 总结,HibernateCRUD操作是Java...

    Hibernate_开发指南最新版

    1. **延迟加载(Lazy Loading)**: 只在真正需要时才加载关联对象,减少内存占用。 2. **批处理(Batch Processing)**: 一次提交多个操作,提高数据库访问效率。 3. **缓存策略配置**: 选择合适的缓存策略,如使用...

    Hibernate基础教程Hibernate基础教程

    - 查询:`Session.get()`根据ID获取对象,`Session.load()`延迟加载,`Session.createQuery()`或`Session.createSQLQuery()`执行HQL或SQL查询。 5. **查询** - HQL(Hibernate Query Language):面向对象的查询...

    Hibernate框架入门教程及实践指导

    4. **检索对象**:`Session.get()`根据ID获取对象,`Session.load()`延迟加载,`Session.createQuery()`或`Session.createCriteria()`执行查询。 **六、事务管理** Hibernate支持编程式和声明式事务管理。编程式...

    SSH(struts+spring+hibernate)面试题总结

    `Session.save()`, `Session.load()`, `Session.get()`等方法会将对象置于持久化状态。 - **游离状态(Detached)**:对象不再在Session缓存中,但数据库可能仍有记录。关闭Session或调用`Session.evict()`会使得对象...

    hibernate.zip

    7. **懒加载与即时加载**: Hibernate提供了懒加载机制,通过`@LazyCollection(LazyCollectionOption.EXTRA)`或`@OneToMany(mappedBy = "...', fetch = FetchType.LAZY)`来实现延迟加载,减少初始加载的数据量。...

    Hibernate的get和load方法的区别

    `Session.load(Class clazz, Serializable id)`方法是延迟加载(Lazy Loading)的代表。它并不会立即执行SQL查询,而是创建一个代理对象,这个代理对象在真正被访问时(如调用其属性或方法)才会执行查询。这是为了...

    2022年javaWeb面试题含答案.doc

    二级缓存包括应用及缓存、分布式缓存和第三方缓存的实现。 Spring 工作机制 Spring 是一种轻量的控制反转和面向切面容器框架。其工作机制包括: 1. DispatcherServlet 把所有的祈求都提交给 DispatcherServlet,...

    hibernate大纲

    1. **延迟加载(Lazy Loading)**:按需加载关联对象,减少不必要的数据库访问。 2. **批处理(Batch Processing)**:通过设置 `hibernate.jdbc.batch_size` 提高批量操作性能。 3. **缓存策略**:合理利用缓存减少...

    hibernate-3.6.8.Final

    包括批处理(Batch Processing)、缓存策略调整、延迟加载(Lazy Loading)的合理使用、避免N+1查询问题等,都是提升Hibernate性能的关键。 总结,Hibernate 3.6.8.Final是开发者进行数据库操作的强大工具,通过...

    hibernate基础

    懒加载允许延迟加载关联的对象,以提高性能。而级联操作可以在一个对象操作时,自动处理其关联对象的相关操作。 9. **HQL和SQL的使用** Hibernate 提供了HQL,一种面向对象的查询语言,与SQL类似但更面向对象。...

Global site tag (gtag.js) - Google Analytics