Мы разработали структуру сохранения данных с использованием 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 предупреждает об этом. Кто-нибудь пробовал этот подход? Любая обратная связь очень ценится.