【问题标题】:Hibernate: "could not read column value from result set ... could not deserialize"休眠:“无法从结果集中读取列值......无法反序列化”
【发布时间】:2013-03-15 14:27:12
【问题描述】:

我有一个想要持久化到数据库的 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 行,在 hibernate 日志中我看到以下错误:

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”字段。

【问题讨论】:

    标签: hibernate serialization


    【解决方案1】:

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

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

    这解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多