【发布时间】:2014-02-04 08:22:36
【问题描述】:
由于我们的系统架构,我正在尝试实施客户端编排策略(ibm-client-orchestration)。我们使用一个集成层,它实际上编排了一些 Web 服务。对 Web 服务的调用是在单个工作单元中进行的,并委托给使用 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();
在提到的链接中,作者建议在保存时使用传播 MANDATORY 并在查找时使用传播支持,这将尝试在事务日志中查找数据。不知何故,我不知道在上述情况下我无法在查找步骤中找到插入的数据。以下是一些可能会有所帮助的有用信息:
- 我们使用 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");
我没有在 Websphere 中配置任何 JPA Provider,所以它应该是它的默认实现。
我提到如果我在委托 DAO 层中使用 jpa 存储库中的 saveAndFlush() 方法,我可以找到是否,但我宁愿不使用它并使用事务传播。
transactionManager bean 的定义:
@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();
}
感谢任何建议。 谢谢。
【问题讨论】:
-
你应该由 spring 处理生命周期,你不应该自己打电话给
afterPropertiesSet,spring 会为你做这件事。与getObject()相同,您应该简单地返回FactoryBean以便spring 可以正确管理它。