2014-06-30 18 views
0

我想使用Spring Data JPA來訪問一個Informix數據庫。數據庫本身不支持事務。我們通過JDBC訪問數據庫。 Informix的JDBC驅動程序會在您嘗試執行任何事務時拋出錯誤。 getAutoCommit返回true,並將其設置爲false將引發錯誤如何使用沒有事務的Spring Data JPA?

傳統代碼使用HibernateTemplate訪問Informix。該服務方法沒有任何交易註釋

我正在工作一個新的項目,訪問相同的數據庫,我想嘗試使用Spring數據。因爲我想繼續使用ORM層,所以我嘗試連接Spring Data JPA。

所以,我最初的配置是

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="datasource"/> 
    <property name="packagesToScan" value="org.company.project.business"/> 
    <property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 

    </bean> 
    </property> 
    <property name="jpaProperties"> 
    <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.InformixDialect</prop> 
     <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
     <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
     <prop key="hibernate.current_session_context_class">thread</prop> 
     <prop key="hibernate.connection.autocommit">false</prop>  
     <prop key="hibernate.jdbc.use_get_generated_keys">true</prop> 
     <prop key="hibernate.order_updates">true</prop> 
     <prop key="hibernate.generate_statistics">true</prop> 
     <prop key="hibernate.connection.release_mode">after_transaction</prop> 
    </props> 
    </property> 
</bean> 
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close" depends-on="c3p0InformixConnectionCustomizer"> 
    <constructor-arg type="java.lang.String" value="database"/> 
    <property name="driverClass" value="com.informix.jdbc.IfxDriver"/> 
    <property name="jdbcUrl" value="${database.jdbc.url}"/> 
    <property name="user" value="${database.jdbc.user}"/> 
    <property name="password" value="${database.jdbc.password}"/> 
</bean> 



<bean id="persistenceExceptionTranslationPostProcessor" 
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

<jpa:repositories base-package="org.company.project.respository" entity-manager-factory-ref="emf"/> 

遺憾的是,春數據抱怨,我需要一個事務管理器。但是,我不需要交易經理!我不;噸甚至不需要交易

所以,媽和笑聲,我宣佈JPA事務管理器

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="emf"/> 
</bean> 

顯然,Informix驅動程序開始抱怨不支持事務

所以,問題是我如何告訴Spring Data不要使用事務攔截器?我通過一些調用進行調試,所有對SimpleJPARepository的調用都有4個攔截器連接到它們中。其中之一是一個TransactionInterceptor。有沒有辦法告訴Spring數據不要連接攔截器?


我最終做的是實現一個NullTransactionManager。基本上,一個事務管理器什麼都不做,只是爲了讓Spring Data咀嚼。有沒有更好的辦法?我寧願告訴創建存儲庫的工廠不要連接攔截器。

public class NullTransactionManager implements PlatformTransactionManager 
{ 
    public NullTransactionManager() 
    { 
     super(); 
    } 

    public TransactionStatus getTransaction(TransactionDefinition pDefinition) throws TransactionException 
    { 
     // return a transaction status that doesn't do antyhing 
     return new TransactionStatus() { 
      public boolean isNewTransaction() 
      { 
       return false; 
      } 

      public boolean hasSavepoint() 
      { 
       return false; 
      } 

      public void setRollbackOnly() 
      { 
      } 

      public boolean isRollbackOnly() 
      { 
       return false; 
      } 

      public void flush() 
      { 
      } 

      public boolean isCompleted() 
      { 
       return false; 
      } 

      public Object createSavepoint() 
      { 
       return null; 
      } 

      public void rollbackToSavepoint(Object pSavepoint) 
      { 
      } 

      public void releaseSavepoint(Object pSavepoint) 
      { 
      } 
     }; 
    } 

    public void commit(TransactionStatus pStatus) throws TransactionException 
    { 
     //do nothing 
    } 

    public void rollback(TransactionStatus pStatus) throws TransactionException 
    { 
     //do nothing 
    } 
} 
+0

什麼樣的數據庫不支持事務? :) [我假設這是你的情況](http://docs.oracle.com/cd/E13222_01/wls/docs60/informix4/API_jinf4.html#647593)。所以你正在運行一個非ANSI的非日誌記錄數據庫?出於好奇,以這種方式配置Informix數據庫有什麼好處? –

+0

如果您使用EclipseLink作爲您的JPA提供程序,[您可以使用此解決方案](http://stackoverflow.com/a/15661480/2408961) –

+0

您是否嘗試過使用[hibernate.connection.autocommit]這裏](http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html/ch03.html#configuration-jdbc-properties)? –

回答

3

根據定義,您無法通過JPA在沒有事務的情況下保留對象。說明書第7.9.1節明確指出,像EntityManager.persist(…)….merge(…)這樣的方法需要進行交易。

相關問題