Activiti 7 默认不自动建表,需显式配置 spring.activiti.schema-generation-enabled=true;MySQL 8+ 必须使用 com.mysql.cj.jdbc.Driver 驱动并添加 serverTimezone=UTC 等参数,否则初始化失败。

Activiti 7 默认不自动建表,必须显式配置 schema-generation
Activiti 7(基于 Spring Boot)不会像旧版那样靠 activiti.cfg.xml 自动执行 DDL。它依赖 Spring Boot 的 JPA/Hibernate 行为,但默认关闭了自动建表——哪怕你写了 spring.jpa.hibernate.ddl-auto=create,Activiti 的专用表也不会被创建。
根本原因是:Activiti 7 把流程引擎和数据访问层解耦了,ProcessEngine 不再直接绑定 Hibernate SessionFactory;它的元数据表由独立的 activiti-spring-boot-starter-process 管理,且默认跳过初始化。
- 必须在
application.yml中启用:spring.activiti.schema-generation-enabled=true - 对应属性名不是
spring.jpa.*下的,也不是activiti.*(旧版前缀),而是spring.activiti.*(注意前缀是spring.) - 若用 H2 做开发库,建议同时加:
spring.activiti.database-schema-update=true(仅限开发,生产禁用)
MySQL 8+ 需手动处理时区与驱动类名
连 MySQL 时常见报错:The server time zone value 'XXX' is unrecognized 或启动失败提示 Failed to determine embedded database driver class,本质是 JDBC URL 缺少时区参数、或用了老版驱动类名。
Activiti 7 要求 JDK 8+、MySQL Connector/J 8.0+,而新版驱动类名已从 com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver,且强制要求指定服务端时区。
立即学习“Java免费学习笔记(深入)”;
- JDBC URL 必须带
?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true -
spring.datasource.driver-class-name必须设为com.mysql.cj.jdbc.Driver - 如果误用
com.mysql.jdbc.Driver,Spring Boot 2.3+ 会静默忽略数据源配置,导致 Activiti 初始化时找不到连接池,抛No qualifying bean of type 'javax.sql.DataSource'
表名大小写敏感引发的“找不到 ACT_GE_PROPERTY”错误
Linux/Unix 下 MySQL 默认开启 lower_case_table_names=0,而 Activiti 生成的表名全小写(如 act_ge_property),但某些环境里应用代码里写的 SQL 却引用了大写名(比如旧文档残留、IDE 自动生成的 mapper),结果查不到记录,日志里反复刷 Table 'ACT_GE_PROPERTY' doesn't exist(注意这里是大写)。
这不是 Activiti 的 bug,是 MySQL 服务端配置和客户端预期不一致。Hibernate 默认用小写生成表,但 MyBatis 或自定义 SQL 若硬编码大写表名,就会撞上这个坑。
- 最稳方案:MySQL 启动时加
--lower-case-table-names=1(重启生效,不可动态改) - 临时绕过:在
application.yml中加spring.activiti.database-schema-update=true并确保首次启动时数据库为空——这样 Activiti 会按自己规则建一次全小写表 - 别信网上“把 SQL 全改成大写”的改法,Activiti 内部校验逻辑认的是小写名,改了反而初始化失败
多数据源下 Activiti 只认 spring.datasource,不支持 customDataSource Bean
如果你项目里定义了多个 @Bean DataSource(比如一个业务库、一个日志库),然后想让 Activiti 用其中某一个,直接 @Primary 或 @Qualifier("xxx") 是没用的。Activiti 7 的自动配置只读 spring.datasource.* 配置项,完全忽略 Spring 容器里的其他 DataSource Bean。
这意味着:就算你写了 @Bean @Primary DataSource activitiDataSource(),只要 spring.datasource.url 没配,Activiti 就会 fallback 到嵌入式 H2,或者直接启动失败。
- 唯一有效方式:所有数据库连接参数必须走
spring.datasource.*配置项(包括 url、username、password、driver-class-name) - 如果真要隔离数据源,得关掉自动配置:
@SpringBootApplication(exclude = {ActivitiProcessAutoConfiguration.class}),再手写ProcessEngineConfiguration,代价是失去全部 starter 的便利性 - 别试图通过
spring.activiti.datasource.*来覆盖——这个配置项根本不存在,文档里也没有
spring.activiti.schema-generation-enabled=true 这一行,以及 MySQL 8 的驱动类名和时区参数——这两个点没对齐,后面所有流程部署都会卡在“找不到引擎实例”。










