Я пытаюсь реализовать Стратегию координации клиентов (ibm-client-orchestration) из-за нашей системной архитектуры. Мы используем слой интеграции, который фактически организует некоторые веб-службы. Вызов веб-служб выполняется в одном блоке работы и делегирует бизнес-уровень, который использует Spring framework. Пример может быть что-то вроде этого:Использование Spring @Transactional распространения в JTA
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.
- Платформа менеджер транзакций с весны сконфигурирован как JtaTransactionManager
Entity Кормушка завод берется из 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 хранилища, я могу найти, если, но я бы preffer не использовать его и использовать распространение транзакций.
Определение для 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' самостоятельно, весна сделает это за вас. То же самое с 'getObject()', вы должны просто вернуть «FactoryBean», чтобы весна могла правильно управлять им. –