org.postgresql.util.PSQLException: 错误: 关系 "act_ge_property" 不存在

本文介绍了解决在使用Activiti工作流引擎时遇到的数据库更新问题,特别是当使用drop-create模式启动项目时,出现的act_ge_property表不存在的错误。解决方案包括删除相关表并重新创建,以及执行特定的SQL脚本来重建数据库结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说解决方式:

删除act_*相关的表,然后手动重建表。act_ge_property表中有4行数据也要手动插入。

插入sql语句在activiti-engine-6.0.0.jar中有。

activiti-engine-6.0.0.jar!\org\activiti\db\create\activiti.postgres.create.engine.sql

activiti.postgres.create.history.sql

activiti.postgres.create.identity.sql

三个文件都要执行。

现象:

今天在使用databaseSchemaUpdate=drop-create属性配置启动项目后,

<property name="databaseSchemaUpdate" value="drop-create" />

报出:

192.168.137.209 2019-06-25 15:40:14,371 ERROR (CommandContext.java:122)- Error while closing command context
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database.  Cause: org.postgresql.util.PSQLException: 错误: 关系 "act_ge_property" 不存在
  位置:15
### The error may exist in org/activiti/db/mapping/entity/Property.xml
### The error may involve org.activiti.engine.impl.persistence.entity.PropertyEntityImpl.selectProperty-Inline
### The error occurred while setting parameters
### SQL: select * from ACT_GE_PROPERTY where NAME_ = ?
### Cause: org.postgresql.util.PSQLException: 错误: 关系 "act_ge_property" 不存在
  位置:15
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
    at org.activiti.engine.impl.db.DbSqlSession.selectById(DbSqlSession.java:364)
    at org.activiti.engine.impl.db.DbSqlSession.selectById(DbSqlSession.java:348)
    at org.activiti.engine.impl.db.DbSqlSession.dbSchemaUpdate(DbSqlSession.java:910)
    at org.activiti.engine.impl.db.DbSqlSession.performSchemaOperationsProcessEngineBuild(DbSqlSession.java:1318)
    at org.activiti.engine.impl.SchemaOperationsProcessEngineBuild.execute(SchemaOperationsProcessEngineBuild.java:28)
    at org.activiti.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:37)
    at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:78)
    at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:57)
    at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:42)
    at org.activiti.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:48)
    at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:63)
    at com.arvato.service.bpm.config.MyTransactionInterceptor.execute(MyTransactionInterceptor.java:48)
    at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:29)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:44)
    at org.activiti.engine.impl.ProcessEngineImpl.<init>(ProcessEngineImpl.java:81)
    at org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:665)
    at org.activiti.spring.SpringProcessEngineConfiguration.buildProcessEngine(SpringProcessEngineConfiguration.java:65)
    at org.activiti.spring.ProcessEngineFactoryBean.getObject(ProcessEngineFactoryBean.java:57)
    at org.activiti.spring.ProcessEngineFactoryBean.getObject(ProcessEngineFactoryBean.java:32)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:101)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1645)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1182)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:327)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:373)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1348)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:137)
    at com.arvato.service.bpm.BpmServiceApplication.main(BpmServiceApplication.java:28)
Caused by: org.postgresql.util.PSQLException: 错误: 关系 "act_ge_property" 不存在
  位置:15
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2477)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2190)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:300)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:169)
    at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:158)
    at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:498)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    ... 49 common frames omitted

 

 

<think>问题分析:用户报错信息显示PostgreSQL数据库中的表`act_ru_variable`存在,但用户已经配置了`camunda.bpm.database.schema-update: true`,理论上应该自动建表。需要排查原因并给出解决方案。 可能原因: 1. 数据库连接配置错误,导致没有正确连接到目标数据库。 2. 数据库用户权限足,无法创建表。 3. PostgreSQL的schema设置问题,表可能被创建到了其他schema下。 4. Camunda版本与数据库兼容。 解决步骤: 1. 检查数据库连接配置,确保数据库存在且连接信息正确。 2. 检查数据库用户是否有创建表的权限。 3. 检查PostgreSQL的默认schema(通常是public),或者Camunda配置中是否指定了schema。 4. 确认Camunda版本与PostgreSQL版本兼容性。 配置调整建议: - 在`application.yml`中显式指定数据库schema(如果使用非public schema) - 确保数据库驱动正确 修改后的配置示例: ```yaml spring: datasource: url: jdbc:postgresql://localhost:5432/camunda?currentSchema=public # 显式指定schema username: postgres password: 123456 driver-class-name: org.postgresql.Driver camunda.bpm: admin-user: id: admin password: admin123 database: schema-update: true # 确保开启 # 如果使用非默认schema,可以配置table-prefix(注意:这会在表名前加schema,是标准做法) # 更好的方式是在JDBC URL中指定currentSchema ``` 其他排查方法: 1. 手动检查数据库,查看是否有任何Camunda表被创建(比如`act_ge_property`)。 2. 查看启动日志,是否有建表相的SQL执行错误。 如果问题仍然存在,可以尝试手动初始化数据库: - 从Camunda官方下载对应版本的SQL脚本:https://github.com/camunda/camunda-bpm-platform/tree/master/distro/sql - 选择正确的脚本(如`postgresql_engine_7.18.0.sql`)在目标数据库中执行 于MyBatis-Plus的配置:用户当前的配置没有问题,与Camunda建表无,因此可以保留。</think>针对 PostgreSQL 报错 `relation "act_ru_variable" does not exist` 的问题,以下是完整的解决方案: ### 问题原因分析 1. **核心问题**:Camunda 自动建表失败 2. **直接原因**:虽然配置了 `schema-update: true`,但 PostgreSQL 的权限或配置阻止了自动建表 3. **潜在原因**: - 数据库用户缺少创建表的权限 - PostgreSQL 的默认 schema 设置问题 - JDBC 连接参数未指定 schema - Camunda 版本与 PostgreSQL 兼容性问题 ### 完整解决方案 #### 1. 显式指定 PostgreSQL 的 schema(键修复) 在 JDBC URL 中添加 `currentSchema` 参数: ```yaml spring: datasource: url: jdbc:postgresql://localhost:5432/camunda?currentSchema=public # 确保包含 ?currentSchema=public ``` #### 2. 验证数据库用户权限 执行以下 SQL 确保用户有建表权限: ```sql -- 检查权限 SELECT usename, usecreatedb, usesuper FROM pg_user WHERE usename = 'your_username'; -- 授权语句(需要管理员执行) ALTER USER your_username CREATEDB; GRANT ALL PRIVILEGES ON DATABASE camunda TO your_username; ``` #### 3. 完整配置文件示例 ```yaml spring: datasource: url: jdbc:postgresql://localhost:5432/camunda?currentSchema=public username: postgres password: your_password driver-class-name: org.postgresql.Driver initialization-mode: always # 确保初始化执行 camunda.bpm: admin-user: id: admin password: admin123 database: schema-update: true # 确保开启 table-prefix: act_ # 显式声明表前缀 history-level: full # 启用历史记录 # 添加Hikari连接池配置避免超时 hikari: connection-timeout: 30000 maximum-pool-size: 10 mybatis-plus: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.nmm.camunda.entity configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志 ``` #### 4. 手动初始化脚本(备选方案) 创建 `schema-postgresql.sql` 在 `resources` 目录下: ```sql CREATE SCHEMA IF NOT EXISTS public; SET search_path TO public; -- 创建Camunda核心表 CREATE TABLE act_ru_variable (...); -- [其他Camunda表结构,从官方获取完整脚本] ``` #### 5. 依赖版本检查 确保版本兼容性: ```xml <properties> <camunda.version>7.18.0</camunda.version> <postgresql.version>42.6.0</postgresql.version> </properties> ``` ### 验证步骤 1. 启动时观察日志: - 搜索 `Executing create table` 键词 - 检查是否有 `Table 'act_ru_variable' created` 消息 2. 手动查询数据库: ```sql SELECT * FROM pg_tables WHERE tablename LIKE 'act_%'; ``` 3. 访问 `http://localhost:8080/camunda/app` 查看控制台是否正常加载 ### 常见陷阱排查 1. 如果使用 Docker: ```yaml # 添加容器初始化脚本 command: ["postgres", "-c", "shared_preload_libraries=pg_stat_statements"] ``` 2. Schema 冲突问题: ```sql -- 重置默认schema ALTER DATABASE camunda SET search_path TO public; ``` 3. 表所有权问题: ```sql ALTER TABLE act_ru_variable OWNER TO your_username; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值