我在web.xml中有openSessionInView
过滤器。
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
我已将HibernateDaoSupport的allowCreate
属性设置为true
。现在,对于每个数据库操作,如果我通过getSession
获取会话并在事务之后关闭会话,如:
public List<User> getAllUsers() {
Session session = getSession();
session.enableFetchProfile("USER-ROLE-PROFILE");
Transaction transaction = session.beginTransaction();
DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
List<User> users = criteria.getExecutableCriteria(session).list();
transaction.commit();
session.disableFetchProfile("USER-ROLE-PROFILE");
session.close();
return users;
}
然后此会话关闭会在openSessionInView
?
另一个问题:
这是做各种休眠操作的好方法吗?在上面的代码中,实体User
具有获取配置文件。
谢谢和问候。
答案 0 :(得分:2)
如果getAllUsers()是请求生命周期中的最后一件事,那么这种方法是可以接受的。但是如果你想做更多的数据库操作,那么你必须打开一个新的会话,因为你已经关闭了它。此外,如果您不关闭会话,它将被过滤器关闭:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
...// sf is SessionFactory
sf.getCurrentSession().beginTransaction();
// Call the next filter (continue request processing)
chain.doFilter(request, response);
sf.getCurrentSession().getTransaction().commit();
...
}
答案 1 :(得分:1)
是的,这会导致问题。通过使用过滤器,您可以声明外部管理(创建和关闭)会话。因此,如果您自己关闭它,外部机制将无法工作(并可能抛出异常)