在用spring.net + Nhibernate進行數據庫訪問時回出現如下錯誤:
Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
至於產生錯誤的原因可以參考: http://www.diybl.com/course/3_program/java/javajs/20071018/77920.html
當然出現這個錯誤和保持一個Session有關係
我在web.xml裏添加
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate12"/>
來確保一個次請求會話中保持使用一個數據會話連接.
那麼如何解決這個問題呢? 那就是採用spring.net的事物機制.
添加以下配置腳本
<object id="autoProxyCreator"
type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop">
</object>
<!--事務顧問-->
<object id="transactionAdvisor"
type="Spring.Transaction.Interceptor.TransactionAttributeSourceAdvisor, Spring.Data">
<property name="TransactionInterceptor" ref="transactionInterceptor"/>
</object>
<!--事務攔截器-->
<object id="transactionInterceptor"
type="Spring.Transaction.Interceptor.TransactionInterceptor, Spring.Data">
<property name="TransactionManager" ref="HibernateTransactionManager"/>
<!--note do not have converter from string to this property type registered-->
<property name="TransactionAttributeSource" ref="attributeTransactionAttributeSource"/>
</object>
<object id="attributeTransactionAttributeSource"
type="Spring.Transaction.Interceptor.AttributesTransactionAttributeSource, Spring.Data">
</object>
然後在需要事務處理的代碼加上方法屬性。例如:
[Transaction(Spring.Transaction.TransactionPropagation.Required, ReadOnly = false)]
public void SaveOrUpdate(CompanyInfo info)
{
dao.SaveOrUpdate(info);
}