Hibernate+struts2开发的项目。
解决事务边界和延迟加载的问题,采用了Open Session In view模式。过滤器的代码如下:
import java.io.IOException;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 org.hibernate.Session;
import org.hibernate.Transaction;public class SessionFilter implements Filter { public void destroy() {
// TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
Session session = null;
Transaction transaction = null;
try {

session = HibernateUtil.getThreadLocalSession();
transaction = session.beginTransaction();
chain.doFilter(request, response);
transaction.commit();


} catch (Exception e) {
// TODO: handle exception
if(transaction != null)
transaction.rollback();
throw new RuntimeException(e.getMessage(), e);
}
finally{
HibernateUtil.colseSession();
} } public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub }}当我在项目中使用
Session session  = HibernateUtil.getThreadLocalSession();
session.save(entity);
此时显示了插入的select语句,但数据库木有同步,我也知道这是事务没有提交造成的。也就是这个过滤器有问题,当我不解这个过滤器问题出在哪儿。求高人指点。

解决方案 »

  1.   

    session = HibernateUtil.getThreadLocalSession(); HibernateUtil.colseSession();会不会是因为关闭的session不是引用的session 而导致的。。
      

  2.   

    session = HibernateUtil.getThreadLocalSession();是OpenSession还是getCurrentSession来着?
    Session要是在filter里面已经存在了,你在代码里又手动取得如果是OpenSession会取得另一个Sesion,另你的关闭Session能不能改成closeSession(Session session),来显式地给指定你要关闭的是哪个?
      

  3.   

    session绑定在ThreadLocal里,不会不是同一个session。我也打印出了session,两个session是同一个。
      

  4.   


        public static Session getThreadLocalSession(){
         Session session = localSession.get();
         if(session == null){
         session = getSession();
         localSession.set(session);
         }
         return session;
        
        }
    此时在代码里取得的session肯定是同一个session。因为session绑定到ThreadLocal类中了。那么至于关闭也无须指定关闭那个session了。
      

  5.   

    我觉得怎么那么怪呢,ThreadLocal你又用在了Web环境中,web一个请求本来就是一个线程处理.....
      

  6.   

    对呀,为了使用延迟加载,才会把session绑定到ThreadLocal里的嘛。本来hibernate里提供了getCurrentSession();但我没有用,其实两者的机制就差不多。