问题描述
最近想试试spring4跟hibernate4整合,baseDao继承org.springframework.orm.hibernate4.support.HibernateDaoSupport,baseDao的方法都调用getHibernateTemplate().xxx()实现。奇怪的是前两天增删改查都OK,昨天突然就出问题了,save跟update都报错Writeoperationsarenotallowedinread-onlymode(FlushMode.MANUAL),查询也报错,调用getHibernateTemplate().execute报错说类型转换异常,应该是某个代理类不能转成session类。查了下源代码,确实是这样,查询改成executeWithNativeSession就OK了,save跟update事实上调用的也是这个方法,但是session的创建确有问题,Sessionsession=null;booleanisNew=false;try{session=getSessionFactory().getCurrentSession();}catch(HibernateExceptionex){logger.debug("Couldnotretrievepre-boundHibernatesession",ex);}if(session==null){session=getSessionFactory().openSession();session.setFlushMode(FlushMode.MANUAL);//这里isNew=true;}
而保存操作又需要flushMode不能小于COMMIT,MANUAL是最低的,hibernate3下面的代码是没有的protectedvoidcheckWriteOperationAllowed(Sessionsession)throwsInvalidDataAccessApiUsageException{if(isCheckWriteOperations()&&session.getFlushMode().lessThan(FlushMode.COMMIT)){thrownewInvalidDataAccessApiUsageException("Writeoperationsarenotallowedinread-onlymode(FlushMode.MANUAL):"+"TurnyourSessionintoFlushMode.COMMIT/AUTOorremove'readOnly'markerfromtransactiondefinition.");}}
以前也没遇到这样的问题,关键是TMD的前几天是怎么跑的都搞不明白了,我现在baseDao的save之类的方法改成调用executeWithNativeSession了,回调方法里改flushMode了@Overridepublicvoidsave(Tentity){getHibernateTemplate().executeWithNativeSession(session->{session.setFlushMode(FlushMode.COMMIT);checkWriteOperationAllowed(session);returnsession.save(entity);});}
希望有搞过这个组合的帮忙指点一下是怎么整的,我比较倾向于用hibernateTemplate,实在是没啥分儿,见谅啊
解决方案
解决方案二:
没人鸟我吗没人鸟我吗
解决方案三:
有没有在web层用到OpenSessionInViewFilter?如果用到了是不是现在的某个访问绕过了Filter?
解决方案四:
if(session==null){session=getSessionFactory().openSession();不需要这样的。事务必须配制成required即可。
解决方案五:
引用2楼zhangjihao的回复:
有没有在web层用到OpenSessionInViewFilter?如果用到了是不是现在的某个访问绕过了Filter?
没有用OpenSessionInViewFilter
解决方案六:
引用3楼dyhhello的回复:
if(session==null){session=getSessionFactory().openSession();不需要这样的。事务必须配制成required即可。
上面都是spring的代码,我后来看了,事物根本就没生效,不知道为什么,后来实在折腾不了了换回hibernate3就一切OK了
解决方案七:
我最近也在搭建这个框架,但是session一直注入不了,你是怎么注入进去的。另hibernate4。3.6好像不能用getHibernateTemplate么,只能用hibernate自己的query接口,OpenSessionInViewFilter配置sessionfactory也会出错。。。
解决方案八:
谢谢了,各位大神
解决方案九:
引用6楼u011221339的回复:
我最近也在搭建这个框架,但是session一直注入不了,你是怎么注入进去的。另hibernate4。3.6好像不能用getHibernateTemplate么,只能用hibernate自己的query接口,OpenSessionInViewFilter配置sessionfactory也会出错。。。
注入要么用xml配置,要么用注解,我喜欢用注解,自己写个类继承hibernateDaoSupport类,然后在自己这个类里面写个带注解的set方法,看一下我这篇博客
解决方案十:
引用8楼tsingheng的回复:
Quote: 引用6楼u011221339的回复:
我最近也在搭建这个框架,但是session一直注入不了,你是怎么注入进去的。另hibernate4。3.6好像不能用getHibernateTemplate么,只能用hibernate自己的query接口,OpenSessionInViewFilter配置sessionfactory也会出错。。。注入要么用xml配置,要么用注解,我喜欢用注解,自己写个类继承hibernateDaoSupport类,然后在自己这个类里面写个带注解的set方法,看一下我这篇博客
hibernate4.3没有getHibernateTemplate这个接口了,session接口变化很大