如何在同一个应用程序中使用Hibernate和MyBatis

时间:2012-02-09 16:38:57

标签: java hibernate spring java-ee mybatis

我想使用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. hibernate transaction
  2. hibernate transaction
  3. mybatis transaction
  4. hibernate transaction

    如果mybatis事​​务发生异常,它会回滚,但不会回滚。

    他在这个论坛中了解了如何在Hibernate和MyBatis之间共享事务,但我不明白。

    有人可以告诉我一些链接或任何解决此问题的信息吗?

    对不起我的英语。这很糟糕。

    提前致谢。

    Pedro J.Fdez。 马德里。西班牙。

1 个答案:

答案 0 :(得分:3)

谷歌搜索我找到了解决方案。大问题,简单的解决方案。

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

基本上,要评论de MyBatis事​​务管理器并坚持使用hibernate。

我希望这有助于某人。