2013-06-14 3 views
2

Мы разработали структуру сохранения данных с использованием Mybatis. В каркасе используются простые API MyBatis. (Нам запрещалось использовать какой-либо mybatis-spring, не спрашивайте ... почему?) Теперь нам нужно интегрировать эту структуру сохранения с другой структурой, разработанной другими командами. Эта другая структура в значительной степени использует весенние транзакции для всего. Наши постоянные фреймворки DAO будут использоваться этой инфраструктурой в рамках собственного API .... Это означает, что управляемые весной транзакции будут распространяться на MyBatis DAO. Ожидается, что наша система сохранения на основе MyBatis должна участвовать в весенних управляемых транзакциях без каких-либо проблем.Использование весенних транзакций в API MyBatis

Есть две возможности для выполнения этой работы. (1) Измените нашу постоянную структуру для использования модуля mybatis-spring. Измените DAO для использования непосредственно с помощью сканера, используя весенний и весенний SqlSessionFactoryBean. Я построил небольшой пример, имитирующий оба фреймворка, и все работает без каких-либо проблем. Проблема заключается в таком подходе, что требуется изменить почти все DAO для использования адаптера с пружинным впрыском, тщательно проверить платформу снова. У нас просто нет времени из-за сроков поставки.

(2) Использовать mybatis-spring, определить SqlSeeionFactory с помощью Spring - установить источник данных и диспетчер транзакций, используемый другой инфраструктурой. Что-то вроде

<bean id="smpDataSource" class="oracle.jdbc.pool.OracleDataSource"        destroy-method="close"> 
    <property name="connectionCachingEnabled" value="true" /> 
    <property name="URL"> <value>${db.thin.url}</value></property> 
    <property name="user"> <value>${db.user}</value></property> 
    <property name="password"><value>${db.password}</value> 
    </property> 
</bean> 
    <bean id="dbTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="smpDataSource" /> 
    </bean> 



<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="smpDataSource" /> 
    <property name="typeAliasesPackage" value="spike.smp51.domain" /> 
    <property name="mapperLocations" value="classpath*:spike/smp51/mappers/*.xml"   </bean> 

Затем в applicataion код MyBatis DAO получает sqlseesionfactory с весны, как

 public static SqlSessionFactory getSqlSessionFactory() throws Exception 
    { 

    DefaultSqlSessionFactory sessionFactory =   (DefaultSqlSessionFactory)ctx.getBean("sqlSessionFactory"); 
    return sessionFactory; 

} 

Все объекты DAO уже используют SqlSeesionFactory для открытия и закрытия сессий. Просто замените, что mybatis создал sqlseeionfactory с созданной пружиной sqlseeionfactory. Таким образом, у нас будет только несколько строк изменений. Этот подход описан здесь http://mybatis.github.io/spring/using-api.html Документация mybatis предупреждает об этом подходе - в частности, что он не будет участвовать в весенних транзакциях.

Когда я попробовал второй подход, наша инфраструктура смогла принять участие в весенних транзакциях. Это странно. Является ли документация MyBatis некорректной? Я проверил его широко, создав различные границы транзакций, используя весенние транзакции + АОП. MyBatis DAO могут каждый раз участвовать в управляемых весной транзакциях. Поскольку этот второй подход спасет нам 90% времени разработки - мы действительно любим его использовать, но беспокоимся, так как MyBatis предупреждает об этом. Кто-нибудь пробовал этот подход? Любая обратная связь очень ценится.

ответ

0

У вас есть возврат на это?

мне интересно, если в документе они говорят о org.apache.ibatis.session.SqlSessionFactory от Mybatis-апите, а SqlSessionFactory вы используете из mybatis пружинного Lib: org.mybatis.spring.SqlSessionFactoryBean

Смежные вопросы