6

我为 Liferay 创建了一个 JSR-268 portlet,它使用服务与数据库进行交互。我可以毫无问题或错误地部署 portlet,但是服务定义的表没有创建!

我在测试 portlet 时没有收到“未找到表”错误。我完全没有错误!该表只是在数据库中不存在。我在互联网上发现了其他东西说我应该使用 Liferay 服务生成器创建的生成的“create.sql”文件,但我在任何地方都看不到该文件。

有人可以帮我吗?

4

4 回答 4

11

从未创建过表吗?当我手动删除表格时,我遇到了类似的问题。我以为在再次部署 portlet 时会再次创建它们,但它没有发生。

在研究了源代码后,我发现 Liferay 将有关 portlet 的信息存储在表中servicecomponent,并在执行(伪)SQL 之前检查了两件事META-INF/tables.sql

  1. build.numberinservice.properties必须高于,存储在servicecomponent,
  2. tables.sql必须与存储在 中的不同servicecomponent

只有这样tables.sql才会执行。

实现此目的的一种简单方法是删除servicecomponent寻址您的 portlet 中的所有条目。

于 2010-01-07T12:47:49.650 回答
2

尝试从 servicecomponent 表中删除一个条目。并重新部署您的 portlet。

delete FROM servicecomponent where buildNamespace="<your table namespace>"
于 2013-04-09T09:13:17.513 回答
1

我遇到了同样的问题,下面给出的解决方案对我有用。

脚步

  1. 我已将service.properties中的build.number更改为高于 servicecomponent 中存储的 build.number。
  2. 从META-INF文件夹中删除了所有 xml 文件。
  3. 从webapp/WEB-INF/sql文件夹中删除所有sql文件。

然后build-servicedeploy将创建在service.xml文件中定义的自定义表。

于 2017-10-11T10:42:40.347 回答
0

如果您在 Liferay 6.2 中使用 serviceBuilder,当您在 service.xml 中的 Liferay 模式中定义一个新实体时,任何 Portlet 第一次尝试访问该表时,如果该表不存在,它将被创建。

当你使用不同的模式时会有几个问题,因为有时 Liferay 不会自动创建表。然后你需要启动 Creation SQL 语句并手动创建它,然后通过 LocalServiceUtil 访问它。

于 2016-10-04T10:29:10.277 回答