我有一个我想要持久保存到数据库的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”字段,然后知道如何反序列化“对象”字段。
答案 0 :(得分:0)
事实证明,Hibernate默认情况下将longblob列的最大大小设置为255个字节。我将映射文件中的行更改为:
<property name="object" column="OBJECT" type="serializable" length="2147483647"/>
解决了这个问题。