복붙노트

[SPRING] JPA (Hibernate)와 JDBC (JdbcTemplate 또는 MyBatis)가 동일한 트랜잭션을 공유하도록 Spring을 구성하는 방법

SPRING

JPA (Hibernate)와 JDBC (JdbcTemplate 또는 MyBatis)가 동일한 트랜잭션을 공유하도록 Spring을 구성하는 방법

Spring 3.0.3, JPA 프로 바이더로서 Hibernate 3.5.1을 사용하고 일부 쿼리에는 MyBatis 3.0.2를 사용하고 Tomcat 6에는 내 응용 프로그램을 실행합니다. 둘 다 호출하면 HibernateDAO와 MyBatisDAO가 있습니다. @Transactional로 주석 처리 된 동일한 메소드에서 동일한 트랜잭션을 공유하지 않는 것처럼 보입니다. 서로 다른 연결을 갖습니다. 나는 그들을 어떻게 할 수 있을까?

내가 DataSourceUtils.getConnection (dataSource)에서 연결을 얻으려고했는데 MyBatis가 MyBatis 설정에 문제가 있다고 생각하고 이상하게 생각되는 MyBatis에서 사용하는 것을 얻습니다. JpaTransactionManager를 사용할 수 없습니다. 여러 번 호출해도 DataSoruceUtils.getConnection은 항상 동일한 연결을 제공하며 이는 정상입니다.

일부 인터넷 검색을 한 후에 나는 spring-instrument-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>

부분 mybatis 구성

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

부분 persistence.xml

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

해결법

  1. ==============================

    1.여기서 해결책을 찾았습니다 : JBDC 템플릿에 어떤 트랜잭션 관리자를 사용해야합니까? JPA를 사용할 때?

    여기서 해결책을 찾았습니다 : JBDC 템플릿에 어떤 트랜잭션 관리자를 사용해야합니까? JPA를 사용할 때?

    DataSourceTransactionManager가 아닌 JpaTransactionManager를 사용하고 있습니다. JavaDoc http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/jpa/JpaTransactionManager.html

    모든 entityManagerFactory 설정에 jpaVendorAdapter를 추가 한 후 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>
    
  2. ==============================

    2.Mix에 MyBatis가 없지만, tewe가 transactionManager에 jpaDialect를 추가하는 것이 좋습니다.

    Mix에 MyBatis가 없지만, tewe가 transactionManager에 jpaDialect를 추가하는 것이 좋습니다.

    <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>
    
  3. ==============================

    3.다음을 사용하여 시도해보십시오.

    다음을 사용하여 시도해보십시오.

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

    JDBC 레벨에서 직접 작동합니다. 모든 영속 추상화 (JPA / iBatis 및 JdbcTemplate)는 결국 JDBC를 사용하므로 가장 일반적인 공통 레벨에서 트랜잭션을 처리해야합니다.

    귀하의 경우 javax.persistence.EntityTransaction 추상화를 통해 트랜잭션을 처리하는 JpaTransactionManager를 사용하고 있습니다. 분명히 iBatis는 JPA 트랜잭션을 인식하지 못하기 때문에 아마도 외부에서 작동합니다.

    클래스 로더 / 계측 마법이 필요하지 않습니다. 그냥 작동해야합니다.

  4. from https://stackoverflow.com/questions/6777419/how-to-configure-spring-to-make-jpa-hibernate-and-jdbc-jdbctemplate-or-mybati by cc-by-sa and MIT license