java – HIbernate InvalidDataAccessApiUsageException – 只读模式

前端之家收集整理的这篇文章主要介绍了java – HIbernate InvalidDataAccessApiUsageException – 只读模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

摘要:异常告诉我该事务是只读的;调试println似乎表明我不是只读模式.

为互联网出版编辑的课程 – 抱歉,如果我输入错误内容,但这是代码中的问题给我的问题. saveOrUpdate在其他对象类型上调用时有效,但在此对象上没有.我正在调试时将println添加到saveOrUpdate.我没有编写抽象类,我只是想尝试使用它(现在调试它).

代码下面的相关输出.不知道从哪里开始.

调查后更新:
我也一直在对spring配置进行一些更新,同事指出我调用updateAParameter的一种方法是以一种方式使用spring,而破坏的方法是以另一种方式使用它.不幸的是,破碎的方式是我试图去的方式.

所以我现在理解的问题是,如果我通过获取bean在方法中“手动”实例化DataObjectDAOImpl,那么它允许我正确地写回Hibernate.如果我使用spring为该bean设置一个类变量,所以我不必在每个方法中实例化它,那么当我访问一个试图写入Hibernate的方法时会发生InvalidDataAccessApiUsageException,尽管它报告不在只读模式.我的同事有关于这个主题的理论,但我不明白他想说的是什么 – 关于从SampleClass中提取界面的事情.

  1. // Old way that works.
  2. public class SampleClass {
  3. public void someMethod {
  4. ApplicationContext ac = ApplicationContextFactory.getApplicationContext();
  5. DataObjectDAOImpl dodi = ((DataObjectDAOImpl) ac.getBean("dodi"));
  6. //this works
  7. dodi.updateAParameter("foo",exampleDataObject);
  8. }
  9. }
  10. //New way that doesn't work but I would like it to.
  11. public class SampleClass {
  12. private DataObjectDAOImpl dodi = null;
  13. //'dodi' has getter and setter methods that I am not pasting here for simplicity
  14. public void someMethod {
  15. //causes Exception
  16. dodi.updateAParameter("foo",exampleDataObject);
  17. }
  18. }

这里是spring config中的相关bean

这里是DAOImpl,它对于新旧方式是相同的

  1. public class DataObjectDAOImpl extends AbstractSpringDaoStuff {
  2. ...
  3. public void updateAParameter(String parameter,DataObject do) {
  4. do.setAParameter(parameter);
  5. super.saveOrUpdate(do);
  6. }
  7. }
  8. public abstract class AbstractSpringDaoStuff extends HibernateDaoSupport {
  9. ...
  10. @Transactional(readOnly=false)
  11. protected void saveOrUpdate(Object obj) {
  12. System.out.println ( "Read-only?: " + TransactionSynchronizationManager.isCurrentTransactionReadOnly () );
  13. getHibernateTemplate().saveOrUpdate(obj);
  14. }
  15. }

应用服务器的输出

  1. [java] Read-only?: false
  2. [java] - Method execution Failed:
  3. [java] 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.
  4. [java] at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
  5. [java] at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:750)
  6. [java] at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
  7. [java] at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
  8. [java] at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:748)
  9. [java] at com.est.dao.AbstractSpringDaoStuff.saveOrUpdate(AbstractSpringDaoMDA.java:24)
  10. etc
最佳答案
我在这里可以看到的一个问题是你从同一个bean调用@Transactional方法.我不确定它是如何与你的异常相关的,但是由于Spring的声明式事务管理是通过基于代理的AOP实现的,这意味着这个注释不会生效.

也可以看看:

> 7.6.1 Understanding AOP proxies
> 10.5.1 Understanding the Spring Framework’s declarative transaction implementation

猜你在找的Spring相关文章