Nat*_*ars 6 java orm spring hibernate readonly
摘要:异常告诉我该事务是只读的; 调试println似乎表明我不是只读模式.
为互联网出版编辑的课程 - 抱歉,如果我输入错误的内容,但这是代码中的问题给我的问题.saveOrUpdate在其他对象类型上调用时有效,但在此对象上没有.我正在调试时将println添加到saveOrUpdate.我没有编写抽象类,我只是想尝试使用它(现在调试它).
代码下面的相关输出.不知道从哪里开始.
调查后更新:我也正在对spring配置进行一些更新,同事指出我调用updateAParameter的一种方法是以一种方式使用spring,而破坏的方法是以另一种方式使用它.不幸的是,破碎的方式是我试图去的方式.
所以我现在理解的问题是,如果我通过获取bean在方法中"手动"实例化DataObjectDAOImpl,那么它允许我正确地写回Hibernate.如果我使用spring为该bean设置一个类变量,所以我不必在每个方法中实例化它,那么当我访问一个试图写入Hibernate的方法时会发生InvalidDataAccessApiUsageException,尽管它报告不在只读模式.我的同事有关于这个主题的理论,但我不明白他想说的是什么 - 关于从SampleClass中提取界面的事情.
// Old way that works.
public class SampleClass {
public void someMethod {
ApplicationContext ac = ApplicationContextFactory.getApplicationContext();
DataObjectDAOImpl dodi = ((DataObjectDAOImpl) ac.getBean("dodi"));
//this works
dodi.updateAParameter("foo", exampleDataObject);
}
}
//New way that doesn't work but I would like it to.
public class SampleClass {
private DataObjectDAOImpl dodi = null;
//'dodi' has getter and setter methods that I am not pasting here for simplicity
public void someMethod {
//causes Exception
dodi.updateAParameter("foo", exampleDataObject);
}
}
Run Code Online (Sandbox Code Playgroud)
这里是spring config中的相关bean
<bean id="sampleclass" class="com.service.SampleClass" scope="prototype">
<property name="dodi" ref="doDAOimpl"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
这里是DAOImpl,它对于新旧方式是相同的
public class DataObjectDAOImpl extends AbstractSpringDaoStuff {
...
public void updateAParameter(String parameter, DataObject do) {
do.setAParameter(parameter);
super.saveOrUpdate(do);
}
}
public abstract class AbstractSpringDaoStuff extends HibernateDaoSupport {
...
@Transactional(readOnly=false)
protected void saveOrUpdate(Object obj) {
System.out.println ( "Read-only?: " + TransactionSynchronizationManager.isCurrentTransactionReadOnly () );
getHibernateTemplate().saveOrUpdate(obj);
}
}
Run Code Online (Sandbox Code Playgroud)
应用服务器的输出:
[java] Read-only?: false
[java] - Method execution failed:
[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.
[java] at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
[java] at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:750)
[java] at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
[java] at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
[java] at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:748)
[java] at com.est.dao.AbstractSpringDaoStuff.saveOrUpdate(AbstractSpringDaoMDA.java:24)
etc
Run Code Online (Sandbox Code Playgroud)
我在这里看到的一个可能的问题是您正在@Transactional从同一个 bean 调用方法。我不确定它如何与您的异常相关,但由于 Spring 的声明式事务管理是通过基于代理的 AOP 实现的,这意味着此注释不会生效。
也可以看看:
| 归档时间: |
|
| 查看次数: |
11791 次 |
| 最近记录: |