1、问题
若是你开发了service-builder类型的项目(我确定你必定会开发这种类型的项目),其中所使用的业务实体的数据库表结构就在service.xml中配置,而后执行build-service生成相关dao层的代码(不清楚dao的概念的参考
这篇文章),而后部署项目,portal就会自动执行建立数据库表的sql语句。在62开发中,修改service.xml后,执行build-service,部署项目,portal会根据表结构的变化帮你自动修改数据里面的表,而且尽量保留数据(我试过,增长字段没问题,其余忘了)。
以上是一些背景知识,可是在dxp开发中,根据所谓的数据库保护机制,即便咱们在service.xml中修改了表结构,从新部署项目时,portal不会帮咱们修改数据库表结构,即便在开发阶段也是如此。若是你想让portal修改表结构,你就要按照
这篇文章的方式来作,即:每次修改表结构,就要写对应的数据库升级语句,因为过程比较复杂,我一直没按照文章操做,看着就头晕,不过是为了修改数据库表结构,为什么要我写额外的代码?因而我研究了lifeay执行tables.sql的过程,发现了强制让portal执行tables.sql的方法。
二 、解决方案
首先我只是说出方法,让着急使用的人直接使用,而后我再分享研究过程。
前提:portal是链接mysql启动的
方法:
1. 修改service.xml,运行build-service
2. 链接mysql数据库,找到servicecomponent表,删除里面namespace的值和你的service.xml中namespace值相同的全部数据
3. 同时删除service.xml对对应的已经建立的全部表
4. 在Server Administrator里面执行Verify database tables of all plugins
5. 部署项目,portal会从新执行tables.sql,表就从新创建了
(补充:部署项目后,看到输出了"Running xxxx SQL scripts",可是数据库中仍是没有表,这时再次执行Verify database tables of all plugins就能够在数据库看到表了)
3、研究过程
接下来我分享一下研究过程:
若是是已经部署过的项目,再次部署,只会看到“Upgrading xxxx database to build number ?”之类的信息,说明数据库中必定有表记录着哪些项目部署过,buildnumber是多少,因而咱们找到了servicecomponent表,查看数据,正好有咱们用过的namespace,删除这些数据,从新部署项目,发现并不能执行tables.sql文件,咱们猜想可能内存中存在某些缓存记录这些数据,因而执行了Verify database tables of all plugins,再次部署,终于能执行tables.sql了。ServiceComponentLocalServiceImpl.java是比较核心的类,若是仔细研究这个类的代码会有其余收获,这里只列举一个例子:
你们能够看到这个类其实支持升级数据库的操做,只要以前的tablesql和新的tablesql不一致时,会执行升级数据库操做,按照咱们的思路,咱们两次部署的tables.sql是不一致的,为何不执行这段代码呢?调试发现tablessql变量始终为空字符串(不是null,是值为“”的字符串),因此永远不会执行升级数据库操做,servicecomponent表的CDATA字段也能看出,dxp不会记录tables.sql语句。至于为何执行Verify database tables of all plugins,才能从新执行,我没有再往下研究了,参考
EditServerMVCActionCommand.java中的verifyPluginTables()方法。
分析到此结束,个人分析可能不全面,也可能有错误,请你们批评指正哈。