我有一个要持久保存到数据库的 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”字段。