2013-03-15 33 views
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映射文件:

<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查询我插入的行时。休眠返回0行,并在Hibernate的日志我看到下列错误:

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

如果对象没有被压缩时休眠并将其存储在LONGBLOB列的话,我想这是什么原因造成的“可能不反序列化“的错误。我知道它大于255字节,但MySQL Workbench说它长255字节,所以对象必须因某种原因被截断。

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

回答

0

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

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

解决了这个问题。