Java/休眠 - 在只读模式下不允许写入操作
我最近遇到了一个令人讨厌的例外,在对Google和这个论坛进行了一些研究之后,我仍然没有找到可以解决我的问题的答案。
事情是这样的 - 有时,当我尝试使用休眠状态更新或创建新对象时,我会收到以下错误:
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、类型、长度。可能发生的情况是,如果我通过id获取对象并更新长度,那么它将起作用。如果我按类型获取它并更新长度,那么它将不起作用。因此,到目前为止,为了避免这个问题,我一直在做的是获取对象的方法,这种方法以后不会导致问题,但是尝试找到一种可行的方法变得越来越烦人。
另外,现在我在尝试创建对象时有这个例外(但不是全部,只是在一个特定的表上),并且找不到解决方法的方法。我试图添加事务,但它没有改变任何东西,显示模式是说我无论如何都不是只读的。@Transactional(readOnly = false)
有什么建议吗?
编辑7月26日:以下是一些与休眠相关的配置
<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);
}