Liferay 服务更新
Liferay service update
我有以下 service.xml:
<!-- PK fields -->
<column name="id" type="long" primary="true"/>
<!-- Group instance -->
<!-- <column name="groupId" type="long" /> -->
<!-- Certificate fields -->
<column name="version" type="int" />
<column name="subject" type="String" />
<column name="serial" type="String" />
<column name="encoded" type="Blob" />
<column name="to_auth" type="boolean" />
<column name="to_sign" type="boolean" />
<column name="ins_date" type="Date" />
<column name="alt_date" type="Date" />
<column name="requests" type="Collection" entity="APPLET_REQUEST"/>
<column name="user_certifcates" type="Collection" entity="USER_CERTIFICATE"/>
<!-- Order -->
<order by="asc">
<order-column name="id" />
</order>
<!-- Finder methods: TODO: gets dos campos que pretendo -->
<finder name="id" return-type="Collection">
<finder-column name="id" />
</finder>
</entity>
<!-- PK fields -->
<column name="userid" type="long" primary="true"/>
<column name="companyid" type="long" primary="true"/>
<column name="certificateid" type="long" primary="true"/>
<!-- Group instance -->
<!-- <column name="groupId" type="long" /> -->
<!-- User_Certificate fields -->
<!-- Order -->
<order by="asc">
<order-column name="userid" />
</order>
<finder name="userid" return-type="Collection">
<finder-column name="userid" />
</finder>
</entity>
我用第一个实体部署了服务,没有出现问题。当我插入第二个实体并部署服务时,liferay 显示下一条错误消息:
Caused by: com.liferay.portal.kernel.upgrade.UpgradeException: Upgrade code using unsupported class type 2004
我该如何解决这个问题?
承认,Liferay 的错误信息是——好吧——不是很有帮助。我已提交 LPS-57190 以在将来更改此设置。票证中已经提到了相关的代码更改。到目前为止,如果您查看我针对此问题触及的代码,您会发现 2004 是 ServiceBuilder 尝试更新的列之一的 SQL 类型。这个数字来自 java.sql.Types。检查 class,它是 BLOB - 所以似乎 SB 在升级您的 BLOB 列时遇到了一些问题。
您可以(并且应该)编写自己的升级代码,以明确处理 Liferay 无法自行完成的事情。 Liferay 本身带有很多 UpgradeAction
s,它们会在安装新版本时改变数据库。升级 table 的标准操作(例如描述的 in this thread)并不总是您想要的。
以下是防止 Liferay automatically upgrading your tables 的方法 - 查看 UpgradeAction 并让 Liferay 知道您已自行升级到所需的新 table 结构。
我有以下 service.xml:
<!-- PK fields -->
<column name="id" type="long" primary="true"/>
<!-- Group instance -->
<!-- <column name="groupId" type="long" /> -->
<!-- Certificate fields -->
<column name="version" type="int" />
<column name="subject" type="String" />
<column name="serial" type="String" />
<column name="encoded" type="Blob" />
<column name="to_auth" type="boolean" />
<column name="to_sign" type="boolean" />
<column name="ins_date" type="Date" />
<column name="alt_date" type="Date" />
<column name="requests" type="Collection" entity="APPLET_REQUEST"/>
<column name="user_certifcates" type="Collection" entity="USER_CERTIFICATE"/>
<!-- Order -->
<order by="asc">
<order-column name="id" />
</order>
<!-- Finder methods: TODO: gets dos campos que pretendo -->
<finder name="id" return-type="Collection">
<finder-column name="id" />
</finder>
</entity>
<!-- PK fields -->
<column name="userid" type="long" primary="true"/>
<column name="companyid" type="long" primary="true"/>
<column name="certificateid" type="long" primary="true"/>
<!-- Group instance -->
<!-- <column name="groupId" type="long" /> -->
<!-- User_Certificate fields -->
<!-- Order -->
<order by="asc">
<order-column name="userid" />
</order>
<finder name="userid" return-type="Collection">
<finder-column name="userid" />
</finder>
</entity>
我用第一个实体部署了服务,没有出现问题。当我插入第二个实体并部署服务时,liferay 显示下一条错误消息:
Caused by: com.liferay.portal.kernel.upgrade.UpgradeException: Upgrade code using unsupported class type 2004
我该如何解决这个问题?
承认,Liferay 的错误信息是——好吧——不是很有帮助。我已提交 LPS-57190 以在将来更改此设置。票证中已经提到了相关的代码更改。到目前为止,如果您查看我针对此问题触及的代码,您会发现 2004 是 ServiceBuilder 尝试更新的列之一的 SQL 类型。这个数字来自 java.sql.Types。检查 class,它是 BLOB - 所以似乎 SB 在升级您的 BLOB 列时遇到了一些问题。
您可以(并且应该)编写自己的升级代码,以明确处理 Liferay 无法自行完成的事情。 Liferay 本身带有很多 UpgradeAction
s,它们会在安装新版本时改变数据库。升级 table 的标准操作(例如描述的 in this thread)并不总是您想要的。
以下是防止 Liferay automatically upgrading your tables 的方法 - 查看 UpgradeAction 并让 Liferay 知道您已自行升级到所需的新 table 结构。