Activiti with Hibernate

Activiti with Hibernate

 

 

http://forums.activiti.org/en/viewtopic.php?f=6&t=4360

I have solved the problem for our needs.

Now Activiti uses the HibernateTransactionManager and with 
that we can make a full rollback! 
Its not important that Activiti uses MyBatis, 
because after a small research about MyBatis I found out that 
MyBatis support the HibernateTransactionManager.

ApplicationCotext:
Code:
<!-- DataSource Definition -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/activiti"/>
<property name="username" value="root" />
<property name="password" value="root" />
<property name="poolPreparedStatements" value="true" />
<property name="maxActive" value="50" />
<property name="maxIdle" value="10" />
</bean>

<!-- Session Factory Definition -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
...
</bean>


<!-- Hibernate Transaction Manager Definition -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>

<!-- Process Engine Definition -->
<bean id="processEngineConfiguration" 
class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
</bean>


Methods for start and commit a transation
 (all Transactions done after startTransaction are commit after call commit Transaction):
Code:
protected TransactionStatus startTransaction() {
PlatformTransactionManager manager = getTransactionManager();
DefaultTransactionDefinition d = new DefaultTransactionDefinition();
d.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW);

transaction = manager.getTransaction(d);

return transaction;
}

protected void commit(TransactionStatus transaction) {
PlatformTransactionManager manager = getTransactionManager();
manager.commit(transaction);
}

protected void rollback(TransactionStatus transaction) {
PlatformTransactionManager manager = getTransactionManager();
manager.rollback(transaction);
}

private PlatformTransactionManager getTransactionManager() {

return (PlatformTransactionManager) this.appContext
.getBean("transactionManager");
}


I hope this helps anyone who have a problem 
to integrate activiti in a hibernate environment.

P.S.: I think it would be great if this method (or something like that) 
is also found in the activiti doucumentation, 
because lots of projects currently using hibernate for persitences and in the activit
 documentation doesn't exist a guide to integrate activiti in an hibernate environment.

 

16:49:42.824 | ERROR | restartedMain | org.springframework.boot.SpringApplication | Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cmsDefCourseFeedbackController': Unsatisfied dependency expressed through field 'cmsDefCourseFeedbackService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cmsDefCourseFeedbackServiceImpl': Unsatisfied dependency expressed through field 'iCmsWeCommentService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'TCmsWeCommentServiceImpl': Unsatisfied dependency expressed through field 'userApprovalService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'TCmsCommentUserApprovalServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'taskServiceBean' defined in class path resource [org/activiti/spring/boot/DataSourceProcessEngineAutoConfiguration$DataSourceProcessEngineConfiguration.class]: Unsatisfied dependency expressed through method 'taskServiceBean' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processEngine': FactoryBean threw exception on object creation; nested exception is org.activiti.engine.ActivitiException: couldn't deduct database type from database product name 'KingbaseES'
最新发布
04-01
<think>好的,用户遇到了Spring Boot应用启动失败的问题,具体错误是Activiti无法推断出KingbaseES数据库类型导致的UnsatisfiedDependencyException。首先,我需要回忆一下Spring Boot和Activiti集成时常见的数据库配置问题。 用户提到的错误通常发生在Spring Boot无法正确识别或配置数据库类型时,特别是当使用非默认数据库如KingbaseES时。Activiti需要知道数据库类型来生成相应的SQL语句,如果无法推断,就会导致Bean创建失败。 首先,考虑数据库驱动是否正确引入。KingbaseES可能使用特定的JDBC驱动,比如com.kingbase8.jdbc.Driver。用户需要确认pom.xml或build.gradle中是否有对应的依赖。如果驱动缺失,Spring Boot自然无法识别数据库类型。 接下来,数据源配置是否正确。在application.properties或application.yml中,需要正确配置JDBC URL、用户名和密码。KingbaseES的JDBC URL格式可能类似于jdbc:kingbase8://host:port/database,用户需要确保没有拼写错误,并且网络连接正常。 然后,检查是否缺少数据库方言配置。Hibernate或JPA可能需要指定方言,KingbaseES可能有自己的方言类,比如org.hibernate.dialect.KingbaseESDialect。如果没有配置,Hibernate可能无法正确生成SQL,导致Activiti出错。 另外,查看Activiti的配置。可能需要显式设置数据库类型,例如在配置文件中添加activiti.database-type=kingbasees,或者通过Java配置类设置。这可以覆盖自动推断,直接告诉Activiti使用哪种数据库。 还有,包扫描的问题。Spring Boot默认扫描主类所在包及其子包,如果Activiti的配置类或相关Bean不在这些包下,可能导致无法注入。这时需要使用@ComponentScan注解扩展扫描路径,或者在@SpringBootTest中指定配置类,如用户提供的引用[1]所述。 此外,检查MyBatis或其他ORM框架的配置。如果项目中使用了MyBatis,需要确保@MapperScan正确配置,或者Mapper接口被正确扫描,如引用[4]提到的。否则,可能出现Bean找不到的问题,间接导致依赖注入失败。 还有可能,KingbaseES的JDBC驱动版本与当前Spring Boot或Activiti版本不兼容,需要确认驱动版本是否匹配,必要时升级或降级驱动版本。 测试时,用户应该在测试类上使用@SpringBootTest并指定配置类,确保测试环境与生产环境一致,如引用[1]中的解决方案。这可以避免测试时配置不同导致的Bean注入问题。 最后,如果以上步骤都确认无误,可能需要查看完整的堆栈跟踪,确定具体的Bean创建失败点。有时候,错误信息中会指出哪个Bean的依赖无法满足,从而进一步缩小问题范围。 总结下来,解决方案可能包括:添加正确的数据库驱动、配置数据源、设置数据库方言、显式指定Activiti的数据库类型、确保包扫描正确,以及检查测试配置。需要逐步排查每个可能的环节,确保所有配置正确无误。</think>### Spring Boot整合Activiti连接KingbaseES数据库类型推断错误的解决方案 当Spring Boot应用整合Activiti工作流引擎连接KingbaseES数据库时,出现`UnsatisfiedDependencyException`错误,通常与以下配置问题相关: #### 1. 添加数据库驱动依赖 KingbaseES需要专用的JDBC驱动。在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>com.kingbase</groupId> <artifactId>kingbase8</artifactId> <version>8.6.0</version> <!-- 根据实际版本调整 --> </dependency> ``` #### 2. 配置数据源参数 在`application.properties`中显式指定数据库类型: ```properties spring.datasource.url=jdbc:kingbase8://localhost:54321/mydb spring.datasource.username=admin spring.datasource.password=123456 spring.datasource.driver-class-name=com.kingbase8.jdbc.Driver # 强制指定Activiti数据库类型 activiti.database-type=kingbasees ``` #### 3. 配置Hibernate方言 在`application.properties`中追加: ```properties spring.jpa.database-platform=org.hibernate.dialect.KingbaseESDialect ``` #### 4. 检查包扫描范围 确保主启动类包含`@ComponentScan`注解: ```java @SpringBootApplication @ComponentScan(basePackages = {"com.yourpackage.activiti", "org.activiti"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 5. 测试环境配置 测试类需要指定配置类: ```java @SpringBootTest(classes = {Application.class, ActivitiConfig.class}) public class ActivitiTest { // 测试方法 } ``` #### 6. 验证XML配置文件 检查所有XML配置文件中是否包含正确的bean定义,特别注意: ```xml <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource"/> <property name="databaseType" value="kingbasees"/> <!-- 显式声明 --> </bean> ``` [^1]: 测试类需关联配置类确保bean注入正确 [^2]: 包扫描范围不足会导致bean加载失败 [^3]: XML配置错误是常见异常根源 [^4]: Mapper扫描配置影响bean识别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值