gpt4 book ai didi

java - HIbernate InvalidDataAccessApiUsageException - 只读模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:27:18 31 4
gpt4 key购买 nike

总结:异常告诉我事务是只读的;调试 println 似乎表明我没有处于只读模式。

为 Internet 发布编辑的类 - 如果我输入错误,请抱歉,但这是给我带来问题的代码的主旨。 saveOrUpdate 在调用其他对象类型时起作用,但不适用于此对象类型。我在调试时将 println 添加到 saveOrUpdate。我没有编写抽象类,我只是想使用它(现在调试它)。

代码下方的相关输出。不确定从这里去哪里。

调查后更新:我也一直在对 spring 配置进行一些更新,一位同事指出,我从中调用 updateAParameter 的一种方法是以一种方式使用 spring,而损坏的方法是以另一种方式使用它。不幸的是,断路正是我试图到达的路。

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

// 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);
}
}

这是来自 spring 配置的相关 bean

<bean id="sampleclass" class="com.service.SampleClass" scope="prototype">
<property name="dodi" ref="doDAOimpl"/>
</bean>

这里是 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);
}
}

应用服务器的输出:

     [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

最佳答案

我在这里看到的一个可能的问题是您正在从同一个 bean 调用 @Transactional 方法。我不确定它如何与您的异常相关,但由于 Spring 的声明式事务管理是通过基于代理的 AOP 实现的,这意味着该注释不会生效。

另请参阅:

关于java - HIbernate InvalidDataAccessApiUsageException - 只读模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874835/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com