hibernate异常:解决Hibernate的Write operations are not allowed in read-only mode (FlushMode.NEVER) .....
报错:
Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
解决方法:
在方法体中加入
getHibernateTemplate().setFlushMode(HibernateTemplate.FLUSH_EAGER);
解决
另附未测试方法
方法2:重写OpenSessionInViewFilter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package cn.com.farben.framework.util; import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.orm.hibernate3.SessionFactoryUtils; public class OpenSessionInViewFilter extends org.springframework.orm.hibernate3.support.OpenSessionInViewFilter { protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException { Session session = SessionFactoryUtils.getSession(sessionFactory, true ); session.setFlushMode(FlushMode.COMMIT); return session; } protected void closeSession(Session session, SessionFactory factory) { session.flush(); super .closeSession(session, factory); } } |
配置web.xml:
1
2
3
4
5
6
7
8
9
10
11
12
|
< filter > < filter-name >hibernateFilter</ filter-name > < filter-class >cn.com.farben.framework.util.OpenSessionInViewFilter</ filter-class > < init-param > < param-name >singleSession</ param-name > < param-value >true</ param-value > </ init-param > </ filter > < filter-mapping > < filter-name >hibernateFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
总结:
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.
很明显,从上面的异常信息可以清晰地知道在事务切入的方法中(数据库写入操作)必须将session设置为FlushMode.COMMIT或者FlushMode.AUTO。