懒加载:
懒加载(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(); } }