2011-07-21 20 views
24

Tek bir dataSource var, Spring 3.0.3, Hazırda 3.5.1 JPA sağlayıcısı olarak kullanıyorum ve MyBatis 3.0 kullanıyorum. Bazı sorgular için 2 ve benim uygulama Tomcat 6 üzerinde çalışır. Ben her ikisi de aynı işlemi paylaştı aynı işlemden aynı işlemi paylaşmak gibi görünüyor, aynı yöntemle hem çağrıldığında bir HibernateDAO ve bir MyBatisDAO var, onlar farklı bağlantılar olsun .
Onları nasıl yapabilirim?Spring, JPA (Hazırda Bekleme) ve JDBC (JdbcTemplate veya MyBatis) ile aynı işlemi paylaşacak şekilde nasıl yapılandırılır

DataSourceUtils.getConnection (dataSource) bağlantısından bir bağlantı kurmayı denedim ve MyBatis tarafından kullanılan ve MyBatis yapılandırmasında sorun olduğunu düşündüğüm ve JpaTransactionManager'ı kullanamayan bir dosya alıyorum. Birden çok kez DataSoruceUtils.getConnection çağırmak bile her zaman aynı bağlantıyı verir, tamam.

kısmi 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> 

kısmi mybatis yapılandırma

(erkek kedi gerçekten :) bunu kullanıyorsa bilmiyorum rağmen) ben yay enstrüman-tomcat en classloader çalıştığım bazı googling sonra

<settings> 
    <setting name="cacheEnabled" value="false" /> 
    <setting name="useGeneratedKeys" value="false" /> 
    <setting name="defaultExecutorType" value="REUSE" /> 
    <setting name="lazyLoadingEnabled" value="false"/> 
</settings> 

kısmi persistence.xml

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 

cevap

34

ben çözüm burada buldum: Ben DataSourceTransactionManager JpaTransactionManager kullanarak ve değilim What transaction manager should I use for JBDC template When using JPA ?

.
javadoc http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/jpa/JpaTransactionManager.html

yöneticisi da işlem içinde doğrudan DataSource erişim (aynı veri kaynağı ile çalışan diğer bir deyişle düz JDBC kodu) destekleyen bu işlem. Bu, JPA'ya ve düz JDBC kullanan hizmetlere (JPA'nın farkında olmadan) erişen hizmetlerin karıştırılmasına izin verir! Uygulama kodunun DataSourceTransactionManager ile aynı basit Bağlantı arama desenine (yani DataSourceUtils.getConnection (javax.sql.DataSource) veya TransactionAwareDataSourceProxy uygulamasına geçmesi gerekir. Bunun, yapılandırmaya satıcıya özgü bir JpaDialect gerektirdiğini unutmayın. beklendiği gibi

benim entityManagerFactory yapılandırma her şey çalışıyor için jpaVendorAdapter ekledikten sonra, JdbcTemplate sorgu ve MyBatis ikisi de aynı işlemde çalışır. JavaDoc dayanarak bir jpaDialect yeterli olmalı ama 4:00 olduğunu.Burada ben :) şimdi karışımda MyBatis yok

<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> 
+0

evet sadece jpa lehçesinin ayarlanması emf.setJpaDialect (yeni HibernateJpaDialect()); ' –

-2

kullanmayı deneyin: JDBC düzeyde doğrudan faaliyet

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

. Tüm kalıcılık soyutlamaları (JPA/iBatis ve JdbcTemplate) nihayetinde JDBC'yi kullanıyor, bu yüzden işlemleri en yüksek ortak düzeyde ele almanız gerekiyor.

Sizin durumunuzda, javax.persistence.EntityTransaction soyutlama yoluyla işlemleri işleyen JpaTransactionManager kullanıyorsunuzdur. Açıkçası iBatis JPA işleminin farkında değildir, bu yüzden muhtemelen bunun dışında çalışır.

Hiçbir sınıf yükleyici/enstrümantasyon sihrine ihtiyacınız yok, sadece çalışmalı.

+0

Ne yazık ki bu işe yaramıyor. – tewe

+0

"Bunun, yapılandırmaya yönelik bir satıcıya özgü JpaDialect gerektirdiğini unutmayın." tewe problemi çivilenmiş - – chrismarx

4

denemek değil, ancak TEWE sadece TransactionManager için jpaDialect ekleyerek önerdi olarak çok işi yapar.

<bean class="org.springframework.orm.jpa.JpaTransactionManager" 
    id="transactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
</bean> 
İlgili konular