----------------------------------------------------将session的开启和关闭写在过滤器里,用来延迟session的生命周期
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
try{
Session session=HibernateSessionFactory.getSession();
request.setAttribute(HIBERNATE_SESSIN_KEY, session);
filterChain.doFilter(request, response);
}finally {
Object obj=request.getAttribute(HIBERNATE_SESSIN_KEY);
if(obj!=null&&obj instanceof Session){
Session session=(Session)obj;
session.close();
}else{
}
}
}
---------------------------------------------------将SessioFactory工厂放在临听器里开启和关闭,和服务器生命周期一样
package com.newer.business.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.newer.business.util.HibernateSessionFactoryUtils;
public class ContextLoadListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
//关闭SessionFactory
HibernateSessionFactoryUtils.destory();
}
public void contextInitialized(ServletContextEvent arg0) {
//开启SessionFactory
HibernateSessionFactoryUtils.init();
}
}
-----------------------------------------------------创建和消除SessionFactory工厂,并提供获得Session方法
package com.newer.business.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateSessionFactoryUtils {
private static SessionFactory sessionFactory;
private static boolean isInit=false;
public static void init(){
if(!isInit){
Configuration cfg=new Configuration().configure();
sessionFactory=cfg.buildSessionFactory();
isInit=true;
}else{
System.out.println("工程已经建起");
}
}
public static Session getSession(){
return sessionFactory.openSession();
}
public static void destory(){
if(sessionFactory!=null&&isInit){
sessionFactory.close();
isInit=false;
}
}
}