hql懒加载后判断对象是否存在_Hibernate学习之懒加载

懒加载:

懒加载(Load On Demand)是一种独特而又强大的数据获取方法 ,是指程序推迟访问数据库

,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。

简述: 当我们查询一个对象的时候,在默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性时,才会向数据库发出再一次的查询.这种现象我们称为 lazy现象

.

解决方法可以这样:

显示初始化 Hibernate.initized(代理对象)

修改对象关系文件 lazy  改写 lazy=false

通过过滤器(web项目) openSessionInView

hibernate中,取消lazy 不要在 one-to-many 的 one的一方的 ,可以在 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 threadLocal=new ThreadLocal();

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

query.setString(i, parameters[i]);

}

}

query.executeUpdate();

}

}

分享到:

2012-09-23 11:32

浏览 921

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值