Hibernate:“无法读取结果集中的列值...无法反序列化”

时间:2013-03-15 14:27:12

标签: hibernate serialization

我有一个我想要持久保存到数据库的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映射文件:

<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”字段,然后知道如何反序列化“对象”字段。

1 个答案:

答案 0 :(得分:0)

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

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

解决了这个问题。