gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:03:48 24 4
gpt4 key购买 nike

我想使用 Hibernate 和 MyBatis 与 Spring 集成构建一个应用程序。在原型(prototype)中,我必须运行它们,但不能一起运行。我的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>

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

  1. hibernate 事务
  2. hibernate 事务
  3. mybatis 事务
  4. hibernate 事务

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

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

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

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

    提前致谢。

    佩德罗·J.Fdez。马德里。西类牙。

最佳答案

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

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

基本上,对 MyBatis 事务管理器进行注释并将其粘贴到 hibernate 状态。

我希望这对某人有所帮助。

关于java - 如何在同一个应用程序中使用 Hibernate 和 MyBatis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9214920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com