这两天被两个异常弄的头都大了,经过网上查资料,终于把问题解决了。如果各位有好的解决方案,忘指教。
首先遇到以下异常:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
网上有些解决方案是在web.xml文件中改写以下代码(红色部分为改写后)
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是会引发发一个新的异常,org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions,如先执行查询操作,再进行更新操作。
最后通过查找网上资料,终于找到解决方案。
最终解决方案:
重写类OpenSessionInViewFilter类中的getSession和closeSession方法:
@Override
protected void closeSession(Session session, SessionFactory sessionFactory) {
session.flush();
super.closeSession(session, sessionFactory);
}
@Override
protected Session getSession(SessionFactory sessionFactory)
throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.beginTransaction();
FlushMode flushMode = getFlushMode();
if (flushMode != null) {
this.setFlushMode(FlushMode.AUTO);
}
session.getTransaction().commit();
return session;
}
然后再web.xml中写入如下代码:
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>。。。。。。.MyOpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
OK!到此问题解决。
如果各位有好的方法,请赐教。