最近我一直遇到一个非常烦人的异常,经过在Google和这个论坛上的一些调研后,我仍然没有找到能够解决我的问题的答案。
事情是这样的-有时候,在尝试使用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);
更新对象时非常奇怪,它有时可以工作,但有时对于同一个对象,在调用相同的方法时就无法工作,这似乎取决于我首次获取对象的方式。例如:假设我有一个三个字段的表:id、type和length。如果我通过id获取该对象并更新其长度,则会成功。如果我通过类型获取并更新长度,则不起作用。因此,我一直在尝试避免问题的方法是以不会在后面引起问题的方法获取对象,但是越来越烦人了,而且很难找到一个可行的方法。
同时,现在我在尝试创建一个对象(但只是在一个特定的表中),却出现了异常,并且找不到解决方法。我尝试在事务中添加
@Transactional(readOnly = false)
,但没有改变任何东西,并且显示模式也表示我不是只读的。 有什么建议吗?编辑7月26日:以下是与Hibernate相关的一些配置。
<property name="hibernateProperties">
<props>
<prop key="jdbc.fetch_size">20</prop>
<prop key="jdbc.batch_size">25</prop>
<prop key="cglib.use_reflection_optimizer">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="connection.autoReconnect">true</prop>
<prop key="connection.autoReconnectForPools">true</prop>
<prop key="connection.is-connection-validation-required">true</prop>
</props>
</property>
另外,如果可以帮助的话
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="execute*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
8月31日编辑:
我扩展了HibernateDaoSupport
的类中,保存对象的相关代码如下:
public void createObject(Object persisObj) {
getHibernateTemplate().save(persisObj);
}
@Cache
的READ_ONLY模式?或者在某个方法/类上注释了@Transactional(readOnly = true)
?我自己也遇到过这些问题,并发现这两个配置对此错误起了作用。特别是如果你加载一个对象,修改它并再次持久化。我特别不喜欢使用HibernateTemplate
,因为它可能会隐藏一些后台配置。如果你贴出一些配置片段,我可能能够帮忙。 - Tarcio Saraiva