0

我有一个要持久保存到数据库的 Java 类:

public class ClassA implements Serializable {
    //
    // other fields not shown
    //

    private ObjectType objectType;  // an enum that indicates the actual class stored in the "object" field
    private Object object;
}

这是休眠映射文件:

<hibernate-mapping default-lazy="false">
    <class name="x.y.z.ClassA" table="ClassA">
        <!--
           other properties removed
        -->

        <property name="objectType" column="OBJECTTYPE">
            <type name="org.hibernate.type.EnumType">
                <param name="enumClass">
                    x.y.z.ClassA$ObjectType
                </param>
                <param name="type">12</param>
            </type>
        </property>

        <property name="object" column="OBJECT" type="serializable"/>
    </class>
</hibernate-mapping>

当我使用 Hibernate 将 ClassA 的实例插入数据库时​​,插入了一行,我看到“object”字段被定义为 longblob。但是,当我使用 MySQL Workbench 查看“对象”字段的数据时,它告诉我数据长度为 255 字节。我试图存储在“对象”字段中的对象包含一些字符串,其组合长度加起来超过 255 个字符。它在存储到 longblob 列之前是否被压缩?

我遇到的问题是当我尝试使用 Hibernate 来查询我插入的行时。Hibernate 返回 0 行,在休眠日志中我看到以下错误:

8167 [Thread-32] INFO  org.hibernate.type.SerializableType - could not read column value from result set: OBJECT195_0_; could not deserialize

如果当 Hibernate 将对象存储在 longblob 列中时对象没有被压缩,那么我猜这就是导致“无法反序列化”错误的原因。我知道它大于 255 字节,但 MySQL Workbench 说它有 255 字节长,因此该对象必须由于某种原因被截断。

但是如果对象正在被压缩,那么 Hibernate 可能无法反序列化它,因为它只是一个 java.lang.Object 类型,它不知道实际的对象类型是什么。如果是这种情况,那么有没有办法为 Hibernate 编写自定义反序列化器?因为实际的对象类型由“objectType”字段指示,所以自定义反序列化器可以检查“objectType”字段,然后知道如何反序列化“object”字段。

4

1 回答 1

0

事实证明,Hibernate 默认将 longblob 列的最大大小设置为 255 字节。我将映射文件中的行更改为:

<property name="object" column="OBJECT" type="serializable" length="2147483647"/>

这解决了问题。

于 2013-03-16T05:17:33.247 回答