Liferay 7.0 修改service.xml后如何让portal重新执行tables.sql

一、问题

如果你开发了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就可以在数据库看到表了)

三、研究过程

接下来我分享一下研究过程:

我们可能注意到了,部署一个新service-builder类型的项目时,控制台会输出一个语句 "Running   xxxx  SQL scripts",在portal源码中搜索“SQL scripts”,找到了在ServiceComponentLocalServiceImpl.java类里面,

如果是已经部署过的项目,再次部署,只会看到“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()方法。

分析到此结束,我的分析可能不全面,也可能有错误,请大家批评指正哈。

时间: 2024-10-30 04:47:54

Liferay 7.0 修改service.xml后如何让portal重新执行tables.sql的相关文章

liferay修改service.xml 中表结构后,数据库中表不发生改变

启动tomcat时,console报错: com.liferay.portal.OldServiceComponentException: Build namespace IEVENTS has build number 444 which is newer than 438. 这是因为每次build service时,会在service.properties文件中修改build.number,这个number会随着build service次数的增加而增加. 因此修改方法为,找到对应的serv

apk修改strings.xml后重新打包出错

============问题描述============ 使用apktool进行解包,之后修改strings.xml中的连接字段,重新打包后的apk安装后无法连接到网络.修改的ip是没有问题的,因为我用这个ip通过eclipse打包后的app是可以正常运行的. ============解决方案1============ 引用 3 楼 mk1172010 的回复: Quote: 引用 1 楼 sagittarius1988 的回复: 估计是编码格式的问题,转成unix格式的 可以讲详细一点吗?什么

Tomcat并发数优化,修改service.xml性能调优 增加最大并发连接数

可以在控制台的启动信息里看见,默认状态下没有被打开nio配置,启动时的信息,如下: 2010-2-1 12:59:40 org.apache.coyote.http11.Http11Protocol init 信息: Initializing Coyote HTTP/1.1 on http-8080 2010-2-1 12:59:40 org.apache.catalina.startup.Catalina load 修改成支持NIO的类型,配置如下: Java代码   <Connector p

Oracle - 数据库打完补丁后,是否必须要执行catbundle.sql

在给数据库打补丁的时候,看文档中都有一个步骤"SQL> @catbundle.sql psu apply",那么这个脚本是不是每次打补丁都要去执行呢. 下图是截自补丁的readme 总结来说就是 1. dbca图形化创建的数据库实例,不需要执行该脚本 2. dbca -silent静默方式创建的数据库实例,不需要执行该脚本 3. 数据库实例在打补丁之前就已经存在的,不需要执行该脚本 那么何时需要执行该脚本呢? 就是只有在给数据库软件打了补丁之后手工创建的数据库才必需要执行这个脚本

配置server.xml后,启动tomcat 失败(Unable to start cluster)及解决方法

在配置负载均衡环境过程中修改server.xml  后重启tomcat报错,报错信息如下 [[email protected] bin]# ./catalina.sh runUsing CATALINA_BASE: /usr/local/TC6_AUsing CATALINA_HOME: /usr/local/TC6_AUsing CATALINA_TMPDIR: /usr/local/TC6_A/tempUsing JRE_HOME: /usr/java/jdk1.6.0_45Using CL

30天轻松学习javaweb_Eclipse在修改了web.xml后将自动更新到tomcat服务器中

context.xml中增加<WatchedResource>WEB-INF/web.xml</WatchedResource>,Eclipse在修改了web.xml后将自动更新到tomcat服务器中. <?xml version='1.0' encoding='utf-8'?> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF

一步步开发Liferay门户(2):Service Builder生成持久化层

Liferay的插件体系是:模型-视图-控制器的portlet MVC框架.MVC是一个伟大的用于Web应用程序的设计模式,在实际应用中还应处理持久化,它可以用于检索.处理或显示.为此你需要添加更多的层:一个持久层和服务层.持久层负责保存和检索模型数据.服务层就像你的应用程序和持久层之间的缓冲区:在将来,它会给你自由的自由,即在不修改任何内容的情况下,使用不同的实现方式来交换你的持久层.这种松耦合是良好的应用程序设计,并在Liferay框架中支持.它通过Service Builder(服务生成器

实例详解:反编译Android APK,修改字节码后再回编译成APK

本文详细介绍了如何反编译一个未被混淆过的Android APK,修改smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk无论输入什么样的用户名和密码都可以成功进入到第二个Activity. 有时难免要反编译一个APK,修改其中的若干关键判断点,然后再回编译成一个全新的可用的apk,这完全是可实现的.若要完成上述工作,需要以下工具,杂家后面会把下载链接也附上.这些软件截止本文发布时,经过杂家确认都是最新的版本. 1.APK-Multi-Toolv1.0.11.zip 用它

如何保证修改resolv.conf后重启不恢复?

如何保证修改resolv.conf后重启不恢复? 修改/etc/resolv.conf,重启网卡后,/etc/resolv.conf恢复到原来的状态. CentOS.redhat下面直接修改/etc/resolv.conf不行.必须要在/etc /sysconfig/network-scripts/ifcfg-eth0里面最后加上dns的设置. 不然,重启后,肯定使用eth0设置中没有设 dns的相关信息,使/etc/resolv.conf恢复到原来的状态. 参考链接:ubuntu设置dns地址