javax.persistence.PersistenceException:org.hibernate.type.SerializationException:无法反序列化

时间:2014-01-30 17:25:42

标签: hibernate jpa

在hibernate中执行Criteria Query时,我得到以下异常:

javax.persistence.PersistenceException: javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize: could not deserialize

可能是什么问题?

PS:虽然可能不相关,但我的hibernate版本是hibernate-4.0.1 final。

6 个答案:

答案 0 :(得分:25)

问题是被引用的实体有另一个对实体的引用,并且该关系没有被任何@OneToMany注释 - 就像注释一样。

答案 1 :(得分:7)

当hibernate从数据库查询结果中获取意外类型的数据时,可能会发生此异常。例如,hibernate需要数字,而是获取字符串。

在这种情况下,在stacktrace中查找StreamCorruptedException: "invalid stream header": 74657374异常。该数字是暗示,但您可能希望将其转换为带有ascii表的文本。 74 65 73 74test作为字符串。这是类似命名的表列的值,但具有完全不同的类型。所以hibernate正在查询错误的列,它恰好偶然存在,所以引发的第一个异常不是column does not exist而是could not deserialize。 Hibernate期待很久但却得到了String。

我遇到了这个混乱,因为忽略了正确的@Column(name="id_user")并且hibernate从字段名称中错误地列出了名称user,而该字段名称不是idUser而只是user getUser()吸气。注释被忽略了,因为它是在属性getter而不是字段上指定的,这是hibernate所期望的,因为实体超类带有@Id注释的ID字段,而不是ID getter,这是我毫无根据的预期。

答案 2 :(得分:2)

在我的情况下,Java 8中的java.time.LocalDate出现了问题,我忘了为该特定属性分配转换器。

似乎较新的版本(5.2.1Final)具有内置转换器,因此如果您没有绑定到特定版本,这可以提供帮助。

但是检查Annotations肯定是要走的路,但我会检查它们。

答案 3 :(得分:0)

我有同样的问题。这是由于@SqlResultSetMapping中的一个枚举。解决方案在这里:@ConstructorResult with Enum in JPA 2.1

编辑,由于@Eugene Mihaylin发表评论:
因此,我遇到以下情况:

    @SqlResultSetMapping(
    name = "MyTargetClassMappingName",
    classes = {
            @ConstructorResult(
                    targetClass = MyTargetClassDTO.class,
                    columns = {
                            @ColumnResult(name = "name_from_query1"),
                            @ColumnResult(name = "name_from_query2"),
                            ...
                            @ColumnResult(name = "name_of_problematic_column", type = MyCustomEnum.class),
                    }
            )
    })
    @Entity
    public class MyTargetClassDTO ...

我需要更改为:

    @SqlResultSetMapping(
    name = "MyTargetClassMappingName",
    classes = {
            @ConstructorResult(
                    targetClass = MyTargetClassDTO.class,
                    columns = {
                            @ColumnResult(name = "name_from_query1"),
                            @ColumnResult(name = "name_from_query2"),
                            ...
                            @ColumnResult(name = "name_of_problematic_column", type = String.class),
                    }
            )
    })
    @Entity
    public class MyTargetClassDTO ...

以解决此问题。

稍后,在DTO的构造函数(标注为@Entity)中,我正在做:MyCustomEnum.valueOf(...),以便解析字符串的值并将其分配给类型为{{ 1}}。

答案 4 :(得分:0)

就我而言,这是Java 8中的java.time.LocalDateTime的问题。

通过添加依赖项进行修复:

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-java8</artifactId>
</dependency>		

答案 5 :(得分:-2)

我的实体类UploadFiles有两个字段作为fid&amp; fname其中fid是主键。 我在dao中查询了

StringBuilder queryString = new StringBuilder("from UploadFiles f where f.fid=1");

Query query = (Query) session.createQuery(queryString.toString());          
return query.list();

执行query.list()时,会产生序列化异常