Как добавить таблицы в базу данных Liferay с помощью FreeMarker?

Я хочу добавить таблицу в свою базу данных с помощью FreeMarker. Я пытался использовать ExpandoTableLocalServiceUtil в моем шаблоне:

<#assign expandoTable = staticUtil["com.liferay.portlet.expando.service.ExpandoTableLocalServiceUtil"] />

затем я попытался добавить таблицу:

<#assign table = expandoTable.addTable(theme_display.getCompanyId(),"", "MYTABLE") />

Но таблица не добавляется.

Я также пробовал таким образом:

${expandoTable.addTable(theme_display.getCompanyId(),"", "ANOTHER-TABLE")}

И я получаю эти ошибки:

Template processing error: "Method public static 
com.liferay.portlet.expando.model.ExpandoTable
com.liferay.portlet.expando.service.ExpandoTableLocalServiceUtil.addTable(long,java.lang.String,java.lang.String) throws
com.liferay.portal.kernel.exception.PortalException,com.liferay.portal.kernel.exception.SystemException threw an exception"

    The problematic instruction:
    ----------
    ==> ${expandoTable.addTable(theme_display.getCompanyId(),"", "ANOTHER-TABLE")} [on line 22, column 1 in eventi-theme_SERVLET_CONTEXT_/templates/portal_normal.ftl]
    ----------

    Caused by: com.liferay.portlet.expando.DuplicateTableNameException: {tableId=0}

person Mustapha Aoussar    schedule 25.11.2015    source источник
comment
А вы видели DuplicateTableNameException?   -  person Tobias Liefke    schedule 25.11.2015


Ответы (1)


API Expando не создает таблицы уровня базы данных, а создает виртуальные таблицы. Проверьте свою базу данных, и вы найдете несколько таблиц «Expando». В них будут все ваши данные. Весь смысл Expando-API заключается в том, что вы можете расширить модель данных без какой-либо новой операции уровня DDL (например, CREATE TABLE) в базе данных.

Если вы хотите создать отдельные таблицы, просто сделайте это, но не используйте для этого Expando.

И, как показывает DuplicateTableNameException, ваша таблица уже добавлена.

Позвольте один архитектурный комментарий: я рассматриваю freemarker (по крайней мере, при обычном использовании) скорее как вариант уровня пользовательского интерфейса для расширения Liferay и обычно ожидаю такого рода операции скорее в компоненте бэкэнда, чем во внешнем интерфейсе.

person Olaf Kock    schedule 26.11.2015