Я пытаюсь реализовать стратегию клиентской оркестровки (ibm -client-orchestration) благодаря нашей системной архитектуре. Мы используем уровень интеграции, который фактически управляет некоторыми веб-сервисами. Вызов веб-сервисов выполняется за одну единицу работы и делегируется бизнес-уровню, который использует среду Spring. Примером может быть что-то вроде этого:
UserTransaction ut = getUserTransaction()
ut.begin();
// insert data, will be delegated to some jpa repository
service1.saveData(data)
// find data inserted above
service2.findData(data)
ut.commit();
В упомянутой ссылке автор предлагает использовать распространение ОБЯЗАТЕЛЬНО при сохранении и распространение ПОДДЕРЖИВАЕТ при поиске, что попытается найти данные в журнале транзакций. Почему-то я не знаю, что не могу найти вставленные данные на шаге поиска, учитывая описанный выше сценарий. Вот некоторая полезная информация, которая может помочь:
- мы используем Websphere 8.5. Наш источник данных поступает из Websphere, настроен как источник данных XA и берется из JNDI.
- Менеджер транзакций платформы из Spring настроен как JtaTransactionManager
Entity Manger Factory берется из LocalContainerEntityManagerFactoryBean и использует Hibernate JPA Vendor со следующими свойствами:
jpaProperties.setProperty("hibernate.hbm2ddl.auto", environment.getRequiredProperty("entitymanagerfactory.hibernate.hbm2ddl.production")); jpaProperties.setProperty("hibernate.connection.autocommit", "false"); jpaProperties.setProperty("hibernate.transaction.jta.platform", "org.hibernate.service.jta.platform.internal.WebSphereJtaPlatform"); jpaProperties.setProperty("hibernate.transaction.manager_lookup_class", "org.hibernate.transaction.WebSphereExtendedJTATransactionLookup");
Я не настраивал провайдера JPA в Websphere, поэтому он должен быть реализацией по умолчанию.
Я упоминаю, что если я использую на уровне делегирования DAO метод saveAndFlush() из репозитория jpa, я могу найти его, но я бы предпочел не использовать его и использовать распространение транзакции.
Определение bean-компонента transactionManager:
@Bean
public PlatformTransactionManager transactionManager() {
JtaTransactionManager txManager = new JtaTransactionManager();
txManager.afterPropertiesSet();
return txManager;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
// hibernate vendor
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(databaseType());
vendorAdapter.setGenerateDdl(true);
// compose entityManager
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setJpaVendorAdapter(vendorAdapter);
factoryBean.setDataSource(datasource());
factoryBean.setJtaDataSource(datasource());
// scan packages
factoryBean.setPackagesToScan(environment.getRequiredProperty("entitymanager.scan.packages"));
// JPA properties
factoryBean.setJpaProperties(getEntityManagerFactoryJpaProperties());
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
Любые предложения приветствуются. Спасибо.
afterPropertiesSet, Spring сделает это за вас. То же самое сgetObject(), вы должны просто вернутьFactoryBean, чтобы Spring мог правильно управлять им. - person M. Deinum   schedule 04.02.2014