如何使用service.xml或Service Builder设置字符串列的大小?

时间:2012-08-16 15:10:50

标签: service size liferay

前历史记录:我在更新实体时遇到JDBCExceptionReporter data exception: string data, right truncation异常。

我发现这意味着,数据对于指定的varchar来说太大了。

service.xml中,列的指定如下:

<column name="message" type="String"/>

我在Liferay的ServiceBuilder这个片段的源代码中找到了:

else if (colType.equals("String")) {
    Map<String, String> hints = ModelHintsUtil.getHints(
        _packagePath + ".model." + entity.getName(), colName);

    int maxLength = 75;

    if (hints != null) {
        maxLength = GetterUtil.getInteger(
            hints.get("max-length"), maxLength);
    }

    if (col.isLocalized()) {
        maxLength = 4000;
    }

    if (maxLength < 4000) {
        sb.append("VARCHAR(" + maxLength + ")");
    }
    else if (maxLength == 4000) {
        sb.append("STRING");
    }
    else if (maxLength > 4000) {
        sb.append("TEXT");
    }
}

现在我的问题是,如何为我的列定义max-length

1 个答案:

答案 0 :(得分:23)

您需要修改您应在以下位置找到的portlet-model-hints.xml文件:

docroot/WEB-INF/src/META-INF/portlet-model-hints.xml

在此处,您可以定义hint值,例如:

<hint-collection name="TEXTAREA">
    <hint name="max-length">500</hint>
</hint-collection>

然后在同一个文件中找到要应用此hint的列,它应如下所示:

<field name="your_column_name" type="String">
    <hint-collection name="TEXTAREA" />
</field>

或者您也可以直接这样写,如果只有一列具有max-length的指定提示:

<field name="your_column_name" type="String">
    <hint name="max-length">500</hint>
</field>

然后,您需要再次运行build-service,在部署portlet时,应更新数据库表以反映此更改。

我希望这能回答你的问题!

还有其他hints,可在此wiki找到一个列表,我刚刚在此显示max-length,因为它听起来就像您需要的那样。

如果您有一个包含一列的表,则完整文件将类似于以下内容。你的很可能会更长一点!

<?xml version="1.0"?>
<model-hints>
    <hint-collection name="TEXTAREA">
        <hint name="max-length">500</hint>
    </hint-collection>
    <model name="com.mynamespace.model.MyModelClass">
        <field name="myColumn" type="String">
            <hint-collection name="TEXTAREA" />
        </field>
    </model>
</model-hints>