我在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
具有访存配置文件。谢谢并恭祝安康。
最佳答案
如果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();
...
}