tew*_*ewe 24 spring hibernate jpa transactions mybatis
我有一个dataSource,我使用Spring 3.0.3,Hibernate 3.5.1作为JPA提供程序,我使用MyBatis 3.0.2进行一些查询,我的应用程序在Tomcat 6上运行.我有一个HibernateDAO和一个MyBatisDAO,当我同时调用它们时从使用@Transactional注释的相同方法看起来它们不共享相同的事务,它们获得不同的连接.
我怎么能让他们这样做?
我已经尝试从DataSourceUtils.getConnection(dataSource)获取连接,我得到了MyBatis使用的连接,这很奇怪我认为问题出在MyBatis配置中,它不能使用JpaTransactionManager.甚至多次调用DataSoruceUtils.getConnection总是给出相同的连接,这没关系.
经过一些谷歌搜索后我尝试了spring-instrument-tomcat的类加载器(虽然我不知道tomcat是否真的使用它:))
部分applicationContext
<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}"/>
</bean>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:META-INF/mybatis/mybatis-config.xml" />
</bean>
Run Code Online (Sandbox Code Playgroud)
部分mybatis配置
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="false" />
<setting name="defaultExecutorType" value="REUSE" />
<setting name="lazyLoadingEnabled" value="false"/>
</settings>
Run Code Online (Sandbox Code Playgroud)
部分persistence.xml
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
Run Code Online (Sandbox Code Playgroud)
tew*_*ewe 35
我在这里找到了解决方案:在使用JPA时,我应该为JBDC模板使用什么事务管理器?
我正在使用JpaTransactionManager而不是DataSourceTransactionManager.
JavaDoc http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/jpa/JpaTransactionManager.html
此事务管理器还支持事务中的直接DataSource访问(即使用相同DataSource的纯JDBC代码).这允许混合访问JPA的服务和使用普通JDBC的服务(不知道JPA)!应用程序代码需要遵循与DataSourceTransactionManager相同的简单连接查找模式(即DataSourceUtils.getConnection(javax.sql.DataSource)或通过TransactionAwareDataSourceProxy).请注意,这需要配置特定于供应商的JpaDialect.
在我将jpaVendorAdapter添加到我的entityManagerFactory配置后,一切正常,JdbcTemplate查询和MyBatis都在预期的同一事务中运行.基于JavaDoc,我猜jpaDialect应该足够了但是现在凌晨4点所以我现在不会尝试:)
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
</bean>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29140 次 |
| 最近记录: |