我为 Liferay 创建了一个 JSR-268 portlet,它使用服务与数据库进行交互。我可以毫无问题或错误地部署 portlet,但是服务定义的表没有创建!
我在测试 portlet 时没有收到“未找到表”错误。我完全没有错误!该表只是在数据库中不存在。我在互联网上发现了其他东西说我应该使用 Liferay 服务生成器创建的生成的“create.sql”文件,但我在任何地方都看不到该文件。
有人可以帮我吗?
从未创建过表吗?当我手动删除表格时,我遇到了类似的问题。我以为在再次部署 portlet 时会再次创建它们,但它没有发生。
在研究了源代码后,我发现 Liferay 将有关 portlet 的信息存储在表中servicecomponent
,并在执行(伪)SQL 之前检查了两件事META-INF/tables.sql
:
build.number
inservice.properties
必须高于,存储在servicecomponent
,tables.sql
必须与存储在 中的不同servicecomponent
。只有这样tables.sql
才会执行。
实现此目的的一种简单方法是删除servicecomponent
寻址您的 portlet 中的所有条目。
尝试从 servicecomponent 表中删除一个条目。并重新部署您的 portlet。
delete FROM servicecomponent where buildNamespace="<your table namespace>"
我遇到了同样的问题,下面给出的解决方案对我有用。
脚步
然后build-service和deploy将创建在service.xml文件中定义的自定义表。
如果您在 Liferay 6.2 中使用 serviceBuilder,当您在 service.xml 中的 Liferay 模式中定义一个新实体时,任何 Portlet 第一次尝试访问该表时,如果该表不存在,它将被创建。
当你使用不同的模式时会有几个问题,因为有时 Liferay 不会自动创建表。然后你需要启动 Creation SQL 语句并手动创建它,然后通过 LocalServiceUtil 访问它。