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

Ped*_*dez 2 java spring hibernate mybatis jakarta-ee

我想使用 Hibernate 和 MyBatis 与 Spring 集成来构建一个应用程序。在原型中,我必须运行它们,但不能一起运行。我的Spring应用上下文是:

\n\n
    <?xml version="1.0" encoding="UTF-8"?>\n<!--\n    Document   : applicationContext-spring.xml\n    Created on : 26 de diciembre de 2012, 15:49\n    Author     : Pedro Fdez\n    Description:\n        Fichero de configuraci\xc3\xb3n de Spring\n-->\n<beans xmlns="http://www.springframework.org/schema/beans"\n           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n           xmlns:aop="http://www.springframework.org/schema/aop"\n           xmlns:context="http://www.springframework.org/schema/context"\n           xmlns:tx="http://www.springframework.org/schema/tx"\n           xsi:schemaLocation="http://www.springframework.org/schema/beans \n            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\n            http://www.springframework.org/schema/aop \n            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd\n            http://www.springframework.org/schema/context \n            http://www.springframework.org/schema/context/spring-context-3.0.xsd\n            http://www.springframework.org/schema/tx \n            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" default-autowire="byName">\n\n    <context:annotation-config />\n    <context:component-scan base-package="com.administracion.model.dao.implementations" />\n    <tx:annotation-driven transaction-manager="txManagerHibernate"/>\n    <aop:aspectj-autoproxy />   \n\n    <!-- ............................ -->\n    <!-- Configuraci\xc3\xb3n de datasource -->\n    <!-- ............................ -->\n    <bean id="dataSource"\n        class="org.apache.commons.dbcp.BasicDataSource"\n        destroy-method="close">\n        <property name="driverClassName" value="${jdbc.driverClassName}"/>\n        <property name="url" value="${jdbc.url}"/>\n        <property name="username" value="${jdbc.username}"/>\n        <property name="password" value="${jdbc.password}"/>\n    </bean>\n\n    <!-- .......................... -->\n    <!-- Configuraci\xc3\xb3n de Hibernate -->\n    <!-- .......................... -->\n\n    <!-- SessionFactory de Hibernate -->\n    <bean id="sessionFactoryHibernate"\n        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">\n        <property name="dataSource" ref="dataSource"/>\n        <property name="hibernateProperties">\n            <props>\n                <prop key="hibernate.dialect">${hibernate.dialect}</prop>\n            </props>\n        </property>\n\n        <property name="packagesToScan">\n            <list>\n                <value>com.administracion.model.pojos</value>\n            </list>\n        </property>\n    </bean>\n    <!-- Gestor transaccional de Hibernate -->\n    <bean id="txManagerHibernate"\n        class="org.springframework.orm.hibernate3.HibernateTransactionManager">\n        <property name="sessionFactory" ref="sessionFactoryHibernate"/>\n    </bean>\n\n    <!-- ........................ -->\n    <!-- Configuraci\xc3\xb3n Mybatis -->\n    <!-- ........................ -->\n\n    <!-- Gestor transaccional de MyBatis -->\n    <bean id="txManagerMyBatis"\n        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">\n        <property name="dataSource" ref="dataSource" />\n    </bean>\n    <tx:advice id="txAdviceMyBatis" transaction-manager="txManagerMyBatis">\n        <tx:attributes>\n            <tx:method name="*" />\n        </tx:attributes>\n    </tx:advice>\n    <aop:config>\n        <aop:pointcut id="transactionPointCut"\n            expression="execution(* com.administracion.model.dao.interfaces.*.*(..))" />\n        <aop:advisor advice-ref="txAdviceMyBatis" pointcut-ref="transactionPointCut" />\n    </aop:config>\n\n    <!-- SessionFactory de MyBatis -->\n    <bean id="sqlSessionFactoryMyBatis" class="org.mybatis.spring.SqlSessionFactoryBean">\n        <property name="configLocation" value="classpath:conf/mybatis/mybatis-config.xml" />\n        <property name="dataSource" ref="dataSource" />\n    </bean>\n\n    <!-- MapperFactory de Mybatis -->\n    <bean id="profesionMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">\n        <property name="sqlSessionFactory" ref="sqlSessionFactoryMyBatis" />\n        <property name="mapperInterface" value="com.administracion.model.dao.mappers.IProfesionMapper" />\n    </bean> \n\n\n    <bean id="profesionService" class="com.administracion.model.dao.implementations.ProfesionDaoImpl">\n        <property name="profesionMapper" ref="profesionMapper" />\n    </bean>\n    <!-- Declaramos la exportaci\xc3\xb3n del servicio v\xc3\xada RMI -->\n    <bean class="org.springframework.remoting.rmi.RmiServiceExporter">\n        <property name="registryPort" value="${rmi.port.default}"/>\n        <!-- Interface del servicio que exportamos -->\n        <property name="serviceInterface" value="com.administracion.model.dao.interfaces.IProfesionDao"/>\n        <!-- Nombre con que el servicio se va a llamar desde afuera -->\n        <property name="serviceName" value="ProfesionService"/>\n        <!-- Nombre del bean de la implementaci\xc3\xb3n que le hemos dado en el contexto de spring -->\n        <property name="service" ref="profesionService"/>\n    </bean>\n\n</beans>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,每个人都有自己的事务管理器和会话工厂。这是错误的,因为在嵌套事务中可以运行多个事务,例如:

\n\n
    \n
  1. 休眠事务
  2. \n
  3. 休眠事务
  4. \n
  5. mybatis交易
  6. \n
  7. 休眠事务

    \n\n

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

    \n\n

    他在这个论坛上读过一篇关于如何在 Hibernate 和 MyBatis 之间共享事务的帖子,但我不明白。

    \n\n

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

    \n\n

    请原谅我的英语。这很糟糕。

    \n\n

    提前致谢。

    \n\n

    佩德罗·J.Fdez。\n马德里。西班牙。

  8. \n
\n

Ped*_*dez 5

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

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

基本上,注释 MyBatis 事务管理器并将其粘贴到 Hibernate 事务管理器上。

我希望这对某人有帮助。