spring 事务问题 HibernateTemplate执行修改操作,提示对象是只读状态,急急急急急!!!!!!!!!

org.springframework.dao.InvalidDataAccessApiUsageException:Writeoperationsarenotallow... org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1175)
at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:739)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)

我查询出一个对象,修改后,再saveOrUpdate();出现此异常
事务配置 如下
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="false" propagation="NOT_SUPPORTED" />
<tx:method name="find*" read-only="false" propagation="NOT_SUPPORTED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>

HibernateTemplate.setFlushMode();也解决不了问题...

各位大侠,求解....
展开
 我来答
百度网友bbb4f305
高粉答主

2018-03-31 · 关注我不会让你失望
知道小有建树答主
回答量:238
采纳率:100%
帮助的人:11.2万
展开全部

原因是DAO采用了Spring容器的事务管理策略,如果操作方法的名称和事务策略中指定的被管理的名称不能被匹配上,spring 就会自动采取默认的事务管理策略(PROPAGATION_REQUIRED,read only)。如果是插入和修改操作,就不会被允许的,所以会报这种异常。

HibernateTemplate

HibernateTemplate是简单易用一种函数,功能是将Hibernate 的持久层访问模板化,创建HibernateTemplate 实例后,注入一个SessionFactory 的引用,就可执行持久化操作。

使用HibernateTemplate

HibernateTemplate 可将Hibernate 的持久层访问模板化,使用HibernateTemplate 非常简单。创建HibernateTemplate 实例后,注入一个SessionFactory 的引用,就可执行持久化操作。SessionFactory 对象可通过构造参数传入,或通过设值方式传入。例如:

//获取Spring 上下文

ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");

//

SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory") ,

HibernateTemplate 提供如下三个构造函数:

· HibernateTemplate() 。

· HibernateTemplate(org.hibernate.SessionFactory sessionFactory)。

· HibernateTemplate(org.hibernate.SessionFactory sessionFactory, boolean allowCreate) 。

第一个构造函数:构造一个默认的HibernateTemplate 实例,因此,使用HibernateTemplate实例之前,还必须使用方法setSessionFactory(SessionFactory sessionFactory)来为HibernateTemplate 传入SessionFactory 的引用。

第二个构造函数:在构造时已经传入SessionFactory 引用。

第三个构造函数:其boolean 型参数表明,如果当前线程己经存在一个非事务性的Session ,是否直接返回此非事务性的Session 。

对于在Web 应用中,通常启动时自动加载ApplicationContext ,SessionFactory 和DAO对象都处在Spring 上下文管理下。因此无须在代码中显式设置,可采用依赖注入解耦SessionFactory 和DAO。其依赖关系可通过配置文件来设置。

伤倏臀w
推荐于2017-11-25 · TA获得超过1115个赞
知道大有可为答主
回答量:864
采纳率:60%
帮助的人:601万
展开全部
好像错误是主要原因是DAO采用了Spring容器的事务管理策略,如果操作方法的名称和事务策略中指定的被管理的名称不能够匹配上,spring 就会采取默认的事务管理策略(PROPAGATION_REQUIRED,read only).如果是插入和修改操作,就不被允许的,所以报这个异常
追问
好吧,我测试下吧。之前我用spring事务注解,也没用啊...
追答
这种问题很难找,慢慢来
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
刮刮清风
2012-06-13 · TA获得超过608个赞
知道小有建树答主
回答量:88
采纳率:100%
帮助的人:86.2万
展开全部
你是不是开了 二级缓存?
如果你开了二级缓存的话.
Pojo的 映射 下有个节点 加一个属性
<cache usage="read-only"/> 默认好像是这个..
改成 <cache usage="read-write" /> 这样就可读可写了.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
句子汇精选
2018-12-12 · TA获得超过434个赞
知道小有建树答主
回答量:708
采纳率:63%
帮助的人:63.7万
展开全部
很简单,你没在在service的实现类上添加一个事物的注解@Transactional
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小神经白羊忠
2020-05-27
知道答主
回答量:4
采纳率:0%
帮助的人:2830
展开全部

HibernateTemplate().setCheckWriteOperations(false);
HibernateTemplate().save(***);

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式