我是在一个filter中创建Hiebernate的session并绑定到线程中,以后每次使用直接冲线程中取出来,业务逻辑中不关闭session,返回到filter的时候由filter关闭;
我的filter具体代码如下:
public class HibernateFilter2 implements Filter { private static SessionFactory factory = null;

private static ThreadLocal<Session> sessionThreadLocal = new ThreadLocal<Session>();

public void destroy() {
System.out.println("HibernateFilter2-----------is destroyed----------");
} public void doFilter(ServletRequest request, ServletResponse reponse,
FilterChain chain) throws IOException, ServletException {
try {
System.out.println("HibernateFilter2 is working");
getSession();
chain.doFilter(request, reponse);
} finally {
//从ThreadLocal中取出来并关闭session
Session session = sessionThreadLocal.get();
if(session != null) {
if(session.isOpen()){
session.close();
}
sessionThreadLocal.remove();
}
}
System.out.println("HibernateFilter2 finish one request");
} @SuppressWarnings("deprecation")
public void init(FilterConfig arg0) throws ServletException {
System.out.println("HibernateFilter2-----------start----------");
factory = new Configuration().configure().buildSessionFactory();
}

public static Session getSession() {
Session session = sessionThreadLocal.get();

if(session == null) {
session = factory.openSession();
sessionThreadLocal.set(session);
}
if(session.isConnected()) {
session.disconnect();
}
return session;
}
}
出现问题的action函数代码如下:
// 处理修改密码
public String modifyPassword() {
if(newPassword == null) {
return ERROR;
}
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");
if(user.getPassword().equals(oldPassword)) {
user.setPassword(newPassword);
userService.modify(user);
}else{
this.addFieldError("msg", "原密码错误");
return ERROR;
}
return SUCCESS;
}
异常部分:
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions at org.hibernate.collection.internal.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:445)
at org.hibernate.event.internal.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:65)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:121)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:82)
at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76)
at org.hibernate.event.internal.AbstractVisitor.process(AbstractVisitor.java:143)
求各位大大帮忙下