1.出現(xiàn)如下錯(cuò)誤:
???? org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition?
? 分析原因:OpenSessionInViewFilter在把session綁在當(dāng)前線程上的時(shí)候,會(huì)把session的flush mode 設(shè)為FlushMode.NEVER,因此,如果某個(gè)方法沒(méi)有事務(wù)或者有只讀事務(wù),則不能對(duì)session做insert,update,delete操作,除非事先把session的flush mode手動(dòng)設(shè)為auto
方案:
1、將singleSession設(shè)為false,這樣只要改web.xml,缺點(diǎn)是Hibernate Session的Instance可能會(huì)大增,使用的JDBC Connection量也會(huì)大增,如果Connection Pool的maxPoolSize設(shè)得太小,很容易就出問(wèn)題。<!-- singleSession默認(rèn)為true,若設(shè)為false則等于沒(méi)用OpenSessionInView -->
2、在控制器中自行管理Session的FlushMode,麻煩的是每個(gè)有Modify的Method都要多幾行程式
1、將singleSession設(shè)為false,這樣只要改web.xml,缺點(diǎn)是Hibernate Session的Instance可能會(huì)大增,使用的JDBC Connection量也會(huì)大增,如果Connection Pool的maxPoolSize設(shè)得太小,很容易就出問(wèn)題。<!-- singleSession默認(rèn)為true,若設(shè)為false則等于沒(méi)用OpenSessionInView -->
2、在控制器中自行管理Session的FlushMode,麻煩的是每個(gè)有Modify的Method都要多幾行程式
session.setFlushMode(FlushMode.AUTO);?
??session.update(user);?
??session.flush();?
??session.update(user);?
??session.flush();?
3、Extend OpenSessionInViewFilter,Override protected Session getSession(SessionFactory sessionFactory),將FlushMode直接改為Auto。
4、讓方法受Spring的事務(wù)控制(service和配置文件對(duì)應(yīng))
4、讓方法受Spring的事務(wù)控制(service和配置文件對(duì)應(yīng))