2014-10-08 41 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