Как использовать Hibernate и MyBatis в одном приложении - PullRequest
1 голос
/ 09 февраля 2012

Я хочу создать приложение с помощью Hibernate и MyBatis интегрироваться с Spring. В прототипе я должен запустить их, но не вместе. Мой прикладной контекст Spring:

    <?xml version="1.0" encoding="UTF-8"?>
<!--
    Document   : applicationContext-spring.xml
    Created on : 26 de diciembre de 2012, 15:49
    Author     : Pedro Fdez
    Description:
        Fichero de configuración de Spring
-->
<beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" default-autowire="byName">

    <context:annotation-config />
    <context:component-scan base-package="com.administracion.model.dao.implementations" />
    <tx:annotation-driven transaction-manager="txManagerHibernate"/>
    <aop:aspectj-autoproxy />   

    <!-- ............................ -->
    <!-- Configuración de datasource -->
    <!-- ............................ -->
    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- .......................... -->
    <!-- Configuración de Hibernate -->
    <!-- .......................... -->

    <!-- SessionFactory de Hibernate -->
    <bean id="sessionFactoryHibernate"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            </props>
        </property>

        <property name="packagesToScan">
            <list>
                <value>com.administracion.model.pojos</value>
            </list>
        </property>
    </bean>
    <!-- Gestor transaccional de Hibernate -->
    <bean id="txManagerHibernate"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactoryHibernate"/>
    </bean>

    <!-- ........................ -->
    <!-- Configuración Mybatis -->
    <!-- ........................ -->

    <!-- Gestor transaccional de MyBatis -->
    <bean id="txManagerMyBatis"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:advice id="txAdviceMyBatis" transaction-manager="txManagerMyBatis">
        <tx:attributes>
            <tx:method name="*" />
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="transactionPointCut"
            expression="execution(* com.administracion.model.dao.interfaces.*.*(..))" />
        <aop:advisor advice-ref="txAdviceMyBatis" pointcut-ref="transactionPointCut" />
    </aop:config>

    <!-- SessionFactory de MyBatis -->
    <bean id="sqlSessionFactoryMyBatis" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:conf/mybatis/mybatis-config.xml" />
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- MapperFactory de Mybatis -->
    <bean id="profesionMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="sqlSessionFactory" ref="sqlSessionFactoryMyBatis" />
        <property name="mapperInterface" value="com.administracion.model.dao.mappers.IProfesionMapper" />
    </bean> 


    <bean id="profesionService" class="com.administracion.model.dao.implementations.ProfesionDaoImpl">
        <property name="profesionMapper" ref="profesionMapper" />
    </bean>
    <!-- Declaramos la exportación del servicio vía RMI -->
    <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
        <property name="registryPort" value="${rmi.port.default}"/>
        <!-- Interface del servicio que exportamos -->
        <property name="serviceInterface" value="com.administracion.model.dao.interfaces.IProfesionDao"/>
        <!-- Nombre con que el servicio se va a llamar desde afuera -->
        <property name="serviceName" value="ProfesionService"/>
        <!-- Nombre del bean de la implementación que le hemos dado en el contexto de spring -->
        <property name="service" ref="profesionService"/>
    </bean>

</beans>

Таким образом, у каждого есть свой менеджер транзакций и фабрика сессий. Это неправильно, потому что во вложенной транзакции может выполняться несколько транзакций, например:

  1. Спящий режим транзакции
  2. Спящий режим транзакции
  3. mybatis транзакция
  4. Спящий режим транзакции

    Если транзакция mybatis делает исключение, она выполняет откат, но не спящий режим.

    Он читает на этом форуме ветку о том, как делить транзакции между Hibernate и MyBatis, но я этого не понимаю.

    Может кто-нибудь рассказать мне о какой-нибудь ссылке или какой-либо информации, чтобы исправить это, пожалуйста?

    Извините за мой английский. Это очень плохо.

    Заранее спасибо.

    Педро Я. Фдез. Мадрид. Испания.

1 Ответ

3 голосов
/ 10 февраля 2012

Поиск в Google Я нашел решение для этого. Большие проблемы, простые решения.

<!-- 
<bean id="txManagerMyBatis"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
--> 
<tx:advice id="txAdviceMyBatis" transaction-manager="txManagerHibernate">

В основном, чтобы прокомментировать менеджер транзакций de MyBatis и прикрепить его к спящему.

Надеюсь, это кому-нибудь поможет.

...