`

Hibernate学习之懒加载

阅读更多

懒加载:

懒加载(Load On Demand)是一种独特而又强大的数据获取方法 ,是指程序推迟访问数据库 ,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。
简述: 当我们查询一个对象的时候,在默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性时,才会向数据库发出再一次的查询.这种现象我们称为 lazy现象 .
解决方法可以这样:
显示初始化 Hibernate.initized(代理对象)
修改对象关系文件 lazy  改写 lazy=false
通过过滤器(web项目) openSessionInView

hibernate中,取消lazy 不要在 one-to-many 的 one的一方的<set /> ,可以在 many的一方配置 lazy=false;

 

通过openSessionInView 来解决懒加载.
让我们的session范围更大,缺点是session关闭会延时

MyFilter1.java:

package com.sina.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.sina.util.HibernateUtil;
public class MyFilter1 extends HttpServlet implements Filter {
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
		Session s=null;
		Transaction tx=null;
		try {
			s =HibernateUtil.getCurrentSession();
			tx=s.beginTransaction();
			arg2.doFilter(arg0, arg1);
			//System.out.prrintln("ok")
			//System.out.println("ok");x.
			tx.commit();
			
		} catch (Exception e) {
			if(tx!=null){
				tx.rollback();
			}
			throw new RuntimeException(e.getMessage());
			// TODO: handle exception
		}finally{
			
			HibernateUtil.closeCurrentSession();
		}		
	}
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub		
	}
}

 

HibernateUtil.java:

package com.sina.util;
import java.util.List;



import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
final public class HibernateUtil {
	private static SessionFactory sessionFactory=null;
	//使用线程局部模式
	private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
	private HibernateUtil(){};
	static {
		sessionFactory=new Configuration().configure().buildSessionFactory();
	}
	
	//获取全新的全新的sesession
	public static Session openSession(){
		return sessionFactory.openSession();
	}
	//获取和线程关联的session
	public static Session getCurrentSession(){
		
		Session session=threadLocal.get();
		//判断是否得到
		if(session==null){
			session=sessionFactory.openSession();
			//把session对象设置到 threadLocal,相当于该session已经和线程绑定
			threadLocal.set(session);
		}
		return session;
		
		
	}
	
	public static void closeCurrentSession(){
		
		Session s=getCurrentSession();
		
		if(s!=null&& s.isOpen() ){
			s.close();
			threadLocal.set(null);
		}
	}
//如果要配置openSessionInView
	//统一的一个修改和删除(批量 hql) hql"delete upate ...??"
	public static void executeUpdateOpenInView(String hql,String [] parameters){
		
			Session s=getCurrentSession();
						
			Query query=s.createQuery(hql);
			//先判断是否有参数要绑定
			if(parameters!=null&& parameters.length>0){
				for(int i=0;i<parameters.length;i++){
					query.setString(i, parameters[i]);
				}
			}
			query.executeUpdate();
					
	}
}
 

 

 

 

分享到:
评论

相关推荐

    hibernate学习资料大全

    【hibernate学习资料大全】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。...希望这些资料能对CSDN的网友们在Hibernate学习之路上提供宝贵的帮助。

    Hibernate学习文档集合

    《Hibernate学习文档集合》 Hibernate,作为Java领域中的一款强大且广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。本集合包含了三个关键的学习文档,分别关注于Hibernate的操作基础、对象关系映射和...

    Hibernate 中文api 等学习资料

    6. **延迟加载和懒加载**:理解何时及如何使用这些特性来提高性能。 7. **实体生命周期**:了解Hibernate如何处理对象的创建、更新、删除等状态变化。 8. **性能调优**:包括批处理、连接池配置、查询优化等方面的...

    hibernate学习总结文档

    关联关系可以通过外键或代理键实现,配置包括懒加载(lazy loading)和级联操作(cascading)。 **缓存机制** Hibernate 提供了缓存策略以提高性能,包括一级缓存(Session 缓存)和二级缓存(可选,如 EhCache)...

    hibernate学习源代码祝你提高

    在这个"hibernate学习源代码祝你提高"的资料包中,我们可以深入理解 Hibernate 的工作原理和设计模式,这对于初学者提升技能非常有帮助。该资源主要针对 Hibernate 3.x 版本,这是一个广泛使用的版本,包含了丰富的...

    hibernate学习笔记,学习大纲【吐血推荐】

    **Hibernate学习笔记与大纲** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本笔记将深入...

    Hibernate DOC中文文档(学习Hibernate必备手册)

    此外,还会涉及主键生成策略和懒加载机制。 4. **会话和事务管理**:解释Hibernate的会话接口(Session)及其作用,如何开始和结束事务,以及事务的隔离级别和回滚规则。 5. **查询语言**:包括HQL(Hibernate ...

    hibernate API帮助文档 及hibernate学习笔记

    - **懒加载与立即加载**: Hibernate支持懒加载策略,以提高性能,仅在需要时加载关联数据。 - **级联操作**: 可以设置级联属性,使得对一个实体的操作影响到与其关联的其他实体。 5. **缓存机制** - 第一级缓存...

    hibernate源码的学习

    - 懒加载(Lazy Loading):关联对象在需要时才加载,节省内存资源。 - 立即加载(Eager Loading):关联对象与主对象一起加载,避免N+1查询问题。 六、缓存机制 Hibernate提供了第一级缓存(Session级别的缓存)和...

    hibernate的lazy策略forClass

    在压缩包文件`hibernate_lazy_for_class`中,可能包含了相关的代码示例、配置文件或日志文件,用于更深入地学习和分析Hibernate的懒加载策略在实际项目中的应用。通过阅读和分析这些资源,开发者可以更好地理解和...

    hibernate 学习总结.doc

    《Hibernate学习总结》 Hibernate,作为Java领域的一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑,而非底层的数据访问。以下是对Hibernate核心概念和技术的详细...

    hibernate学习资料

    在“hibernate学习资料”中,我们可以看到两个关键文件:“hibernate┐≥╝▄┐¬╖ó2016░µ╫╩┴╧”和“hibernate框架开发2016版资料”。这些文件很可能是针对Hibernate框架的教程或指南,可能包含了2016年时的...

    jdbc和hibernate学习内容

    8. **懒加载和级联操作**:了解如何配置和使用懒加载以优化性能,以及如何设置级联操作以简化对象间的关联操作。 总的来说,掌握JDBC和Hibernate对于Java开发者来说是至关重要的,它们是连接Java应用程序与数据库的...

    Hibernate学习课件

    8. **懒加载和即时加载**:Hibernate支持懒加载策略,即关联的对象不会在加载实体时立即加载,而是在需要时才加载,这有助于减少内存消耗。反之,即时加载(Eager Loading)会一次性加载所有关联的数据。 9. **一对...

    Hibernate学习笔记

    019 关联映射文件中集合标签中的 lazy(懒加载)属性 020 、单端关联上的 lazy(懒加载)属性 021 继承关联映射 022 component(组件)关联映射 023 复合主键 关联映射 024 其它 关联映射 025 hibernate 悲观锁、乐观锁 ...

    Hibernate中文学习资料

    Hibernate提供了懒加载和即时加载策略来优化性能。懒加载仅在真正需要时加载关联的对象,而即时加载则在获取主对象时同时加载关联的对象。 11. **集合映射** Hibernate支持多种集合类型的映射,如List、Set、Map...

    Hibernate中文参考文档学习

    - **代理(Proxy)**: 用于实现懒加载,当试图访问代理对象的属性时,才会去数据库加载实际对象。 - **事件监听器(Event Listeners)**: 可以监听对象的生命周期事件,如加载、保存、更新、删除等,实现业务逻辑...

    Hibernate学习笔记与总结

    **Hibernate学习笔记与总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本文将深入探讨Hibernate的核心概念、配置、实体类、映射文件、...

Global site tag (gtag.js) - Google Analytics