2014-10-08 71 views
0

我有使用JPA和JDBC的混合應用。我已經使用@Transactional註釋成功完成了JPA事務的設置,但是我無法使它適用於JDBC。問題而設置的彈簧基於註解的交易

我的配置是這樣的:

<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> 
     <property name="driverClassName" value="${database.driverClassName}"/> 
     <property name="url" value="${database.url}"/> 
     <property name="username" value="${database.username}"/> 
     <property name="password" value="${database.password}"/> 
     <property name="testOnBorrow" value="true"/> 
     <property name="testOnReturn" value="true"/> 
     <property name="testWhileIdle" value="true"/> 
     <property name="timeBetweenEvictionRunsMillis" value="1800000"/> 
     <property name="numTestsPerEvictionRun" value="3"/> 
     <property name="minEvictableIdleTimeMillis" value="1800000"/> 
    </bean> 


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

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="persistenceUnitName" value="persistenceUnit"/> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

我的代碼是:

@Test 
     @Transactional 
     public void testUpdateSQLwithParam() { 
      Object[] params = { "John","", "trol", "test", "M", "Place", "123456789", 
      "[email protected]" }; 
      customQueryDao.insert("PERSON_INSERT_QUERY", params); 
      String sqlConstant = "PERSON_MASTER_UPADTE_QUERY"; 
      params = new Object[]{ "Test", 8 }; 
      customQueryDao.updateSQLwithParam(sqlConstant, params); 

} 

我的JDBC代碼使用的JdbcTemplate執行查詢。請讓我知道如何使用@Transactional註解來實現JDBC事務。使用jpatransactionmgr

回答

0

你有相同的ID(transactionManager的)定義2種豆。用不同的ID試試吧,也許喜歡:

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

<bean id="dataSourceTransactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

這應該工作,你還可以在log4j的啓用調試,看看在你的日誌文件中的交易,這是我在我的log4j.xml:

<!-- 3rdparty Loggers --> 
    <logger name="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <level value="debug" /> 
    </logger> 
0

我可以看到你編輯你試圖修復多個事務管理的問題。但我認爲你沒有刪除一個好...來自JpaTransactionManager的javadoc:該事務管理器也支持事務中的數據源直接訪問(即普通的JDBC代碼使用相同的數據源工作)

恕我直言,你應該將保持JpaTransactionManager,並刪除DataSourceTransactionManager。 (我有一些代碼使用普通的JDBC混合Hibernate訪問與單個HibernateTransactionManager和交易正確管理...)

+0

我使用jdbc模板,如果JpaTransactionManager也支持這一點,我已經嘗試過但不工作 – 2014-10-10 05:57:53

+0

@ PrashantShah它應該工作...如果有錯誤,你能顯示堆棧跟蹤,還是描述會發生什麼? – 2014-10-10 06:16:29

+0

你好嗶嘰,感謝您的回覆,我在下面的測試被插入行和更新其他行,其中第二個查詢所賜例外仍然在第一行得到表中插入代碼 – 2014-10-10 09:18:20