我最近经常遇到一个烦人的例外,经过对谷歌和这个论坛的一些研究后,我仍然没有找到可以解决我的问题的答案.
这是事情 – 有时,我尝试使用hibernate更新或创建一个新对象时出现以下错误:
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.
at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:696)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:694)
真正奇怪的是,有时用getHibernateTemplate()方法更新对象时.saveOrUpdate(object);它会工作,但有时使用相同的对象,并通过调用相同的方法它不起作用,但它似乎取决于我如何获得对象的第一个位置.
示例:假设我有一个包含3个字段的表:id,type,length.可能发生的是,如果我通过id获取对象并更新长度,那么它将起作用.如果我按类型获取并更新长度,那么它将无法工作.所以到目前为止我一直在做的是避免这个问题,就是获取对象后面不会引起问题的方法,但是尝试找到一种有效的方法会变得越来越烦人.
此外,现在我在尝试创建一个对象(但不是所有对象,仅在一个特定的表上)时遇到此异常,并且无法找到解决方法的方法.我试图在事务中添加@Transactional(readOnly = false),但它没有改变任何东西,并且显示模式说我不是以只读方式.
有什么建议?
编辑7月26日:
这里有一些与hibernate相关的配置
20
25
true
true
org.hibernate.dialect.MySQLDialect
true
true
true
如果它可以帮助
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
编辑8月31日:
我的类中扩展HibernateDaoSupport以保存对象的相关代码是:
public void createObject(Object persisObj) {
getHibernateTemplate().save(persisObj);
}
解决方法:
我从视图过滤器更改了单个会话属性.问题解决了:
hibernateFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
singleSession
false
标签:java,spring,hibernate,readonly
来源: https://codeday.me/bug/20190918/1810905.html