相关文章推荐
活泼的弓箭  ·  使用opencsv实现Csv与Java对象转 ...·  1 周前    · 
魁梧的水煮鱼  ·  JQuery将多个动态对象(属性名相同,值不 ...·  1 年前    · 
独立的南瓜  ·  oracle的函数cast进行类型转换_or ...·  1 年前    · 
爽快的冰棍  ·  C#获取当前日期时间的各种格式-腾讯云开发者 ...·  2 年前    · 
腼腆的打火机  ·  16、动态SQL之<where>、<if>条 ...·  2 年前    · 
无聊的长颈鹿  ·  使用Spring特性实现接口多实现类的动态调 ...·  2 年前    · 
Code  ›  Camunda Spring事务集成不起作用开发者社区
bean
https://cloud.tencent.com/developer/ask/sof/113282048
不拘小节的马克杯
2 年前
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
提问
问 Camunda Spring事务集成不起作用
Stack Overflow用户
提问于 2016-05-27 14:32:15
EN

我正在使用Camunda7.3、Spring4.2.4和Hibernate 4.3.8,我试图使用它们处理与 Camunda文件 中解释的事务相同的事务。该事务对Hibernate操作有效,但对Camunda操作无效,如果发生事务回滚,则hibernate操作将被恢复。

@Configuration
public class CamundaConfiguration {
    // Variables with connection Data
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
        bean.setPersistenceUnitName("PostgreSQL");
        bean.setDataSource(dataSource());
        bean.getJpaPropertyMap().put("hibernate.dialect", "org.hibernate.dialect.PostgreSQL82Dialect");
        bean.getJpaPropertyMap().put("hibernate.ejb.naming_strategy", NamingStrategyLowerCase.class.getCanonicalName());
        bean.getJpaPropertyMap().put("hibernate.jdbc.batch_size", 0);
        bean.getJpaPropertyMap().put("hibernate.cache.use_second_level_cache", true);
        bean.getJpaPropertyMap().put("hibernate.cache.use_query_cache", true);
        bean.getJpaPropertyMap().put("javax.persistence.sharedCache.mode", SharedCacheMode.ALL);
        bean.getJpaPropertyMap().put("hibernate.cache.default_cache_concurrency_strategy", "read-write");
        bean.getJpaPropertyMap().put("javax.persistence.validation.factory", validator);
        bean.getJpaPropertyMap().put("hibernate.cache.region.factory_class", SingletonEhCacheRegionFactory.class.getCanonicalName());
        bean.setPersistenceProviderClass(org.hibernate.jpa.HibernatePersistenceProvider.class);
        bean.setPackagesToScan("br.com.model");
        return bean;
    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager bean = new JpaTransactionManager(entityManagerFactory());
        bean.getJpaPropertyMap().put("org.hibernate.flushMode", FlushMode.AUTO);
        bean.setDataSource(dataSource);
        bean.setPersistenceUnitName("PostgreSQL");
        return bean;
    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driverClass);
        config.setJdbcUrl(jdbcUrl);
        config.setUsername(username);
        config.setPassword(password);
        config.setMaximumPoolSize(50);
        config.setConnectionTestQuery("select 1");
        HikariDataSource bean = new HikariDataSource(config);
        return new LazyConnectionDataSourceProxy(bean);
    @Bean
    public ManagedProcessEngineFactoryBean processEngine() {
        ManagedProcessEngineFactoryBean processEngineFactoryBean = new ManagedProcessEngineFactoryBean();
        processEngineFactoryBean.setProcessEngineConfiguration(processEngineConfiguration());
        return processEngineFactoryBean;
    @Bean
    public SpringProcessEngineConfiguration processEngineConfiguration() {
        SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();
        processEngineConfiguration.setDataSource(dataSource());
        processEngineConfiguration.setTransactionManager(transactionManager());
        processEngineConfiguration.setJobExecutorActivate(true);
        processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_TRUE);
        return processEngineConfiguration;
    @Bean
    public TaskService taskService() throws Exception {
        return processEngine().getObject().getTaskService();
}

dataSource和transactionManager与Spring和Hibernate使用的是相同的。

@Service
public class TaskManager {
    @Inject
    private TaskService taskService;
    @Transactional
    public void completeTask(String taskId, final Map<String, Object> variables) {
        org.camunda.bpm.engine.task.Task camundaTask = taskService.createTaskQuery().taskId(taskId).singleResult();
        taskService.complete(camundaTask.getId(), variables);
        // Hibernate Operations
        throw new RuntimeException("Exception test");
}

当执行上面的代码时,会发生回滚,而'Hibernate操作‘是回滚的,但是在taskService.complete中执行的操作不是。

我已经调试了Camunda代码,一切看起来都很好,我找到了一个SpringTransactionInterceptor,命令在 TransactionTemplate.execute() 中执行,此时事务处于活动状态。

1 2.6K 0 票数 1
EN
java
spring
transactions
camunda

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-14 20:47:13

在研究了事务、Jpa和Spring之后,我发现问题在于jpaDialect没有配置,它负责同步JDBC和JTA事务。

可以使用方言对象检索底层JDBC连接,从而允许将JPA事务公开为JDBC事务。

我在配置中包含了以下代码,现在它已经开始工作了:

@Configuration
public class CamundaConfiguration {
    @Bean
    public JpaDialect jpaDialect() {
        return new org.springframework.orm.jpa.vendor.HibernateJpaDialect();
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
        bean.setJpaDialect(jpaDialect());
        bean.setJpaVendorAdapter(new org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter());
        return bean;
    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager bean = new JpaTransactionManager(entityManagerFactory());
        bean.setJpaDialect(jpaDialect());
 
推荐文章
活泼的弓箭  ·  使用opencsv实现Csv与Java对象转换(CSV) - xiaogh
1 周前
魁梧的水煮鱼  ·  JQuery将多个动态对象(属性名相同,值不同)push进同一个数组,结果打印出的数组元素是同一个对象_jquery 撖寡情 push-CSDN博客
1 年前
独立的南瓜  ·  oracle的函数cast进行类型转换_oracle 字母转数字cast-CSDN博客
1 年前
爽快的冰棍  ·  C#获取当前日期时间的各种格式-腾讯云开发者社区-腾讯云
2 年前
腼腆的打火机  ·  16、动态SQL之<where>、<if>条件判断_<where> <if>_苍鹰蛟龙的博客-CSDN博客
2 年前
无聊的长颈鹿  ·  使用Spring特性实现接口多实现类的动态调用方式_java_脚本之家
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号