spring 事务问题 HibernateTemplate执行修改操作,提示对象是只读状态,急急急急急!!!!!!!!!
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();也解决不了问题...
各位大侠,求解.... 展开
原因是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。其依赖关系可通过配置文件来设置。
好吧,我测试下吧。之前我用spring事务注解,也没用啊...
这种问题很难找,慢慢来
如果你开了二级缓存的话.
Pojo的 映射 下有个节点 加一个属性
<cache usage="read-only"/> 默认好像是这个..
改成 <cache usage="read-write" /> 这样就可读可写了.
HibernateTemplate().setCheckWriteOperations(false);
HibernateTemplate().save(***);