最近我一直有一個令人討厭的異常,經過對Google和這個論壇的一些研究後,我仍然沒有找到可以解決我的問題的答案問題。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.
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)
,但它沒有改變任何內容,並且顯示模式是說我不是隻讀的。
有什麼建議嗎?七月
編輯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>
八月的編輯31日相關: 班裏相關的代碼擴展HibernateDaoSupport
,保存的對象是:
public void createObject(Object persisObj) {
getHibernateTemplate().save(persisObj);
}
您是否在使用具有** READ_ONLY **模式的'@ Cache'?或者有一個方法/類在'@Transactional(readOnly = true)'註釋過的地方? 我自己遇到過這類問題,發現這兩個配置對這個錯誤起作用。大多數情況下,如果你加載一個對象,修改它並再次堅持。 我特別不喜歡使用'HibernateTemplate',那也可能是隱藏在後臺的一些配置。 如果你通過你的配置的一些片段,我可能會提供幫助。 –
感謝T男抽出時間回覆。所以我在整個項目中搜索了@ Cache/@ Transactional中的任何一個,並且沒有這樣的事情(我從來沒有把它放在我的項目中)。我實際上沒有配置hibernate或寫入方法,但我現在將添加我的配置在帖子中。此外,創建某些對象時出現此錯誤,但不是全部(始終是相同的),因此它不僅與更新對象有關 – Guillaume