Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JpaTransactionManager未将Activiti实体保存到DB_Spring_Hibernate_Jpa_Activiti_Transactionmanager - Fatal编程技术网

Spring JpaTransactionManager未将Activiti实体保存到DB

Spring JpaTransactionManager未将Activiti实体保存到DB,spring,hibernate,jpa,activiti,transactionmanager,Spring,Hibernate,Jpa,Activiti,Transactionmanager,未将有关Activiti的任何内容保存到数据库中。正在将应用程序实体保存到数据库中。下面依次是spring文件、persistene.xml文件和测试用例 使用SQL Server profiler,我看到一个单独的数据库事务正在为Activiti引起的数据库交互启动,而且我看到这个单独的事务正在回滚,而不是提交。其他应用程序数据库交互正在另一个事务上发生,并且正在提交此特定事务 我认为,根据我的配置,Activiti数据库交互将与应用程序的其余部分在同一事务上发生。我已经检查了我的配置文件和代

未将有关Activiti的任何内容保存到数据库中。正在将应用程序实体保存到数据库中。下面依次是spring文件、persistene.xml文件和测试用例

使用SQL Server profiler,我看到一个单独的数据库事务正在为Activiti引起的数据库交互启动,而且我看到这个单独的事务正在回滚,而不是提交。其他应用程序数据库交互正在另一个事务上发生,并且正在提交此特定事务

  • 我认为,根据我的配置,Activiti数据库交互将与应用程序的其余部分在同一事务上发生。我已经检查了我的配置文件和代码很多次,没有发现任何错误。你知道为什么要为Activiti db交互启动单独的事务吗
  • 当然,前一项是关键问题。然而,了解为什么要回滚单独的事务也很有趣
  • Spring文件:

    <context:annotation-config/>
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    <bean id="ActivitiTrialDataSource" class="org.apache.commons.dbcp.BasicDataSource" >
        <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
        <property name="url" value="jdbc:jtds:sqlserver://localhost:1433/ActivitiTrial" />
        <property name="username" value="ActivitiTrial" />
        <property name="password" value="ActivitiTrial" />
        <property name="defaultAutoCommit" value="false" />
        <property name="initialSize" value="5" />
    </bean>
    
    
    <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
    
    
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="ActivitiTrialDataSource" />
        <property name="persistenceUnitName" value="ActivitiTrial"/>
    </bean>
    
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    
    
    
    <!-- Activiti -->
    <bean id="activitiDataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
        <property name="targetDataSource" ref="ActivitiTrialDataSource" />
    </bean>
    
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="databaseType" value="mssql" />
        <property name="dataSource" ref="activitiDataSource" />
        <property name="transactionsExternallyManaged" value="true" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="databaseSchemaUpdate" value="false" />
        <property name="history" value="audit" />
        <property name="jobExecutorActivate" value="false" />
    </bean>
    
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>
    
    <bean id="activitiRepositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
    <bean id="activitiRuntimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
    <bean id="activitiTaskService" factory-bean="processEngine" factory-method="getTaskService" />
    <bean id="activitiHistoryService" factory-bean="processEngine" factory-method="getHistoryService" />
    <bean id="activitiManagementService" factory-bean="processEngine" factory-method="getManagementService" />
    
    
    
    persistence.xml文件:

    <persistence-unit name="ActivitiTrial">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
    
        <properties>
            <property name="hibernate.archive.autodetection" value="hbm,class"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
            <property name="hibernate.hbm2ddl.auto" value="none"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.ejb.metamodel.generation" value="disabled"/>
        </properties>
    </persistence-unit>
    
    
    org.hibernate.ejb.HibernatePersistence
    
    测试用例:

    @RunWith(SpringJUnit4ClassRunner.class)
    @TransactionConfiguration(defaultRollback=false)
    @ContextConfiguration({"classpath:/springApplicationContext.xml"})
    public class TrialTest {
        @Autowired
        RepositoryService activitiRepositoryService;
    
        @Autowired
        RuntimeService activitiRuntimeService;
    
        @Autowired
        TaskService activitiTaskService;
    
    
        @PersistenceContext(unitName="ActivitiTrial")
        EntityManager entityManager;
    
    
    
        @Test
        @Transactional
        public void trialTest() throws Exception {
            long entryMilliseconds = new Date().getTime();
    
    
            activitiRepositoryService.createDeployment().addClasspathResource("process-definitions/neville.bpmn20.xml").deploy();
    
    
            ApplicationEntity applicationEntity1 = new ApplicationEntity();
            applicationEntity1.name = "App entity 1";
            applicationEntity1.createDate = new Date();
            Session hibernateSessionBeforeActiviti = ((Session) entityManager.getDelegate());
            entityManager.persist(applicationEntity1);
            entityManager.flush();
    
    
            Map<String, Object> processVariables = new HashMap<String, Object>();
            processVariables.put("ApplicationEntityID", applicationEntity1.id);
            ProcessInstance processInstance = activitiRuntimeService.startProcessInstanceByKey("neville", processVariables);
            String processInstanceId = processInstance.getId();
            Task userTask = activitiTaskService.createTaskQuery().processInstanceId(processInstanceId).list().get(0);
    
    
            ApplicationEntity applicationEntity2 = new ApplicationEntity();
            applicationEntity2.name = "App entity 2";
            applicationEntity2.createDate = new Date();
            Session hibernateSessionAfterActiviti = ((Session) entityManager.getDelegate());
            entityManager.persist(applicationEntity2);
            entityManager.flush();
    
    
            System.out.println("Leaving trialTest() in : " + (new Date().getTime() - entryMilliseconds) + " milliseconds.");
        }
    }
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @TransactionConfiguration(defaultRollback=false)
    @ContextConfiguration({“classpath:/springApplicationContext.xml})
    公共类测试{
    @自动连线
    存储服务活动存储服务;
    @自动连线
    RuntimeService活动RuntimeService;
    @自动连线
    TaskService活动TaskService;
    @PersistenceContext(unitName=“ActivityTrial”)
    实体管理器实体管理器;
    @试验
    @交易的
    public void trialTest()引发异常{
    long entrymillizes=new Date().getTime();
    activitiRepositoryService.createDeployment().addClasspathResource(“流程定义/neville.bpmn20.xml”).deploy();
    ApplicationEntity applicationEntity1=新的ApplicationEntity();
    applicationEntity1.name=“应用实体1”;
    applicationEntity1.createDate=新日期();
    会话hibernateSessionBeforeActiviti=((会话)entityManager.getDelegate());
    entityManager.persist(applicationEntity1);
    entityManager.flush();
    Map processVariables=new HashMap();
    processVariables.put(“applicationTityId”,applicationTity1.id);
    ProcessInstance ProcessInstance=activitiRuntimeService.startProcessInstanceByKey(“neville”,processVariables);
    字符串processInstanceId=processInstance.getId();
    TaskUserTask=ActivityTaskService.createTaskQuery().processInstanceId(processInstanceId).list().get(0);
    ApplicationEntity applicationEntity2=新的ApplicationEntity();
    applicationEntity2.name=“应用实体2”;
    applicationEntity2.createDate=新日期();
    会话hibernateSessionAfterActiviti=((会话)entityManager.getDelegate());
    entityManager.persist(applicationtity2);
    entityManager.flush();
    println(“将trialTest()留在:”+(new Date().getTime()-entrymillizes)+“millizes”);
    }
    }
    
    我已经浪费了很多时间试图将公共事务管理器传递给Spring和Activiti,但没有结果。你的问题没有完整的答案,但我希望这能为你节省一些时间

    活动论坛:

    演示:

    这些回购协议说明Activiti不接受jpa/hibernate交易:

    您还可以看到演示(Activiti+Spring+Bitronix),它可能会有所帮助(我还没有时间查看)。

    p.S.


    作为普通事务的替代方案,我看到了补偿事件。

    我已经浪费了很多时间试图将普通事务管理器传递给Spring和Activiti,但没有结果。你的问题没有完整的答案,但我希望这能为你节省一些时间

    活动论坛:

    演示:

    这些回购协议说明Activiti不接受jpa/hibernate交易:

    您还可以看到演示(Activiti+Spring+Bitronix),它可能会有所帮助(我还没有时间查看)。

    p.S.


    作为普通事务的替代方案,我看到了补偿事件。

    我通过解决MyBatis(JDBC)和Hibernate(JPA)之间的冲突解决了这个问题:

    您应该将
    jpaVendorAdapter
    属性添加到
    entityManagerFactory
    bean:

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="ActivitiTrialDataSource" />
        <property name="persistenceUnitName" value="ActivitiTrial"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>
    
    
    

    有关更多详细信息,请参阅的答案。

    我已通过解决MyBatis(JDBC)和Hibernate(JPA)之间的冲突解决了此问题:

    您应该将
    jpaVendorAdapter
    属性添加到
    entityManagerFactory
    bean:

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="ActivitiTrialDataSource" />
        <property name="persistenceUnitName" value="ActivitiTrial"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>
    
    
    
    有关更多详细信息,请参阅的答案