Oracle11g下有两个用户,bpm与bpm_test用户。两个用户都部署了工作流程,一个是正式环境、一个是测试环境。当两个用户都没有activiti的表时,把databaseSchemaUpdate设置成true时,activiti在启动时会自动创建流程引擎相关的表。
但现在bpm用户已经部署了工作流,有activiti的表了,但bpm_test用户还是没有,此时,用bpm_test用户去连接数据库,启动测试环境时,流程引擎不会自动创建表。还会报错:
### The error may exist in org/activiti/db/mapping/entity/Property.xml
很明显,在流程引擎启动时,去读了ACT_GE_PROPERTY表,引擎要获取引擎部署的版本信息做一些初始化。
于是,开始找原因:
难道是databaseSchemaUpdate配置错了,网上查了下,除了配置成true,false,还有create,drop-create等,于是每一个都试下,还是不能自动创建,包同样的错。没办法了,那就看源码吧。
从抛出异常的地方跟踪进去,一直跟到了DbsqlSession那个类,
原来引擎在创建表之前会有个isEngineTablePresent()方法,判断引擎表是否存在。于是在此处打了个断点。程序执行时没有进到else里面,isEngineTablePresent()返回的是true,接着就在getDbVersion()方法里就抛出了如上异常。现在基本上可以确定是isEngineTablePresent()判断是的问题了。于是在跟踪。
原来判读的是ACT_RU_EXECUTION表是否存在。继续跟踪isTablePresent("ACT_RU_EXECUTION")的执行过程。
原来是这样去判断的,那为什么还是没有返回false呢,在此处打一个断点,原来schema的值是NUll。终于知道为什么是返回true了,对于oracle数据库来说,schema就是用户名。现在的问题是怎么才能让引擎拿到schema呢?那样问题就解决了嘛。看了SpringProcessEngineConfiguration的配置项,貌似没有配置schema的配置项。
找到答案了,ProcessEngineConfiguration类里有databaseSchema这个属性,意味着可以在org.activiti.spring.SpringProcessEngineConfiguration这个bean里配上schema属性!<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:normal;background-color:#FFFFFF;">schema属性配置完了 换到其他数据库时还是会有问题啊 如何做到通用呢?分析的很到位
publicSessionopenSession(CommandContextcommandContext){DbSqlSessiondbSqlSession=newDbSqlSession(this,commandContext.getEntityCache());if(getDatabaseSchema()!=null&&getDatabaseSchema().length()>0){try{dbSqlSession.getSqlSession().getConnection().setSchema(getDatabaseSchema());}catch(SQLExceptione){thrownewActivitiException("Couldnotsetdatabaseschemaonconnection",e);}}if(getDatabaseCatalog()!=null&&getDatabaseCatalog().length()>0){try{dbSqlSession.getSqlSession().getConnection().setCatalog(getDatabaseCatalog());}catch(SQLExceptione){thrownewActivitiException("Couldnotsetdatabasecatalogonconnection",e);}}returndbSqlSession;}
dbSqlSession.getSqlSession().getConnection()拿到的T4CConnection没有setSechema方法。。。不然也能设置
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。