Hibernate 학습의 게으름

로드 게으름:
Load On Demand(Load On Demand)는 독특하고 강력한 데이터 획득 방법으로 프로그램이 데이터베이스에 대한 접근을 지연시키는 것을 말한다. 이렇게 하면 데이터베이스에 접근하는 데 시간이 많이 걸리기 때문에 때때로 불필요한 접근을 보장할 수 있다.약술: 우리가 대상을 조회할 때 기본적으로 이 대상의 일반적인 속성만 되돌려주고 사용자가 대상 속성을 사용할 때 데이터베이스에 다시 한 번의 조회를 보낸다.이런 현상을 우리는 레이지현상이라고 부른다.해결 방법은 다음과 같습니다: Hibernate를 초기화합니다.initized (프록시 대상) 수정 대상 관계 파일 lazy 덮어쓰기 lazy =false 필터 (웹 프로젝트) openSession InView hibernate에서 lazy가 원-to-many의 원 측에 있지 않는 를 취소하고 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();
					
	}
}
 
 
 

좋은 웹페이지 즐겨찾기