解决Hibernate Write operations are not allowed in read-only mode的方法
错误信息:
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.
解决方法:
方法1:在出现异常的方法中加入
1 getHibernateTemplate().setFlushMode(HibernateTemplate.FLUSH_EAGER);
方法2:重写OpenSessionInViewFilter
1 package cn.com.farben.framework.util; 2 3 import org.hibernate.FlushMode; 4 import org.hibernate.Session; 5 import org.hibernate.SessionFactory; 6 import org.springframework.dao.DataAccessResourceFailureException; 7 import org.springframework.orm.hibernate3.SessionFactoryUtils; 8 9 public class OpenSessionInViewFilter extends 10 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter { 11 protected Session getSession(SessionFactory sessionFactory) 12 throws DataAccessResourceFailureException { 13 Session session = SessionFactoryUtils.getSession(sessionFactory, true); 14 session.setFlushMode(FlushMode.COMMIT); 15 return session; 16 } 17 18 protected void closeSession(Session session, SessionFactory factory) { 19 session.flush(); 20 super.closeSession(session, factory); 21 } 22 }
配置web.xml:
1 <filter> 2 <filter-name>hibernateFilter</filter-name> 3 <filter-class>cn.com.farben.framework.util.OpenSessionInViewFilter</filter-class> 4 <init-param> 5 <param-name>singleSession</param-name> 6 <param-value>true</param-value> 7 </init-param> 8 </filter> 9 <filter-mapping> 10 <filter-name>hibernateFilter</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping>