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

javax.persistence.PersistenceException:org.hibernate.type.SerializationException:无法反序列化,hibernate,jpa,Hibernate,Jpa,在hibernate中执行条件查询时,出现以下异常: javax.persistence.PersistenceException: javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize: could not deserialize 有什么问题吗 PS:虽然可能不相关,我的hibernate版本是hibernate-4.0.1 final。

在hibernate中执行条件查询时,出现以下异常:

javax.persistence.PersistenceException: javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize: could not deserialize
有什么问题吗


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

问题是引用的实体有另一个对实体的引用,并且该关系没有任何类似于
@OneToMany
的注释进行注释。

我的实体类上载文件有两个字段,即fid和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()
时,会出现序列化异常

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

在这种情况下,在stacktrace中查找
StreamCorruptedException:“无效流头”:74657374
异常。该数字对您来说是一个提示,但您可能希望将其转换为带有ascii表的文本。将
test
作为字符串提供。这是命名类似的表列的值,但类型完全不同。因此hibernate查询了碰巧存在的错误列,因此引发的第一个异常不是
列不存在
,而是
无法反序列化
。Hibernate期望长时间,但得到了字符串


我陷入这种混乱是因为正确的
@Column(name=“id\u user”)
被忽略,hibernate从字段名推断出错误的列名
user
,而字段名不是
idUser
,而是
user
getUser()
getter。注释被忽略,因为它是在属性getter而不是字段上指定的,这是hibernate所期望的,因为实体超类用
@ID
注释了ID字段,而不是ID getter,这是我毫无根据地期望的。

在我的例子中,java 8中的
java.time.LocalDate
有问题,我忘了给那个特定属性分配一个转换器

新版本(5.2.1Final)似乎有一个内置的转换器,因此,如果您没有绑定到特定的版本,这可能会有所帮助


但是检查注释肯定是一种方法,但我会检查所有注释。

我也有同样的问题。这是由于
@SqlResultSetMapping
中的枚举造成的。解决方案如下:

根据@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(…)
,以便解析字符串的值并将其分配给DTO中类型为
MyCustomEnum
的指定字段。

在我的例子中,java 8中的
java.time.LocalDateTime
存在问题

通过添加依赖项修复:


org.hibernate
hibernate-java8

哇,真是个好时机!我花了两天的时间想弄明白同样的事情。我有一个部门实体,它有一个OneToOne和JoinColumn作为员工实体的Manager属性,该实体也有一个Department属性。在看到您的答案(发布日期与我的问题相同)后,我意识到我的员工实体没有相应的OneToMany属性。谢谢我真的很高兴我能帮上忙:)不幸的是,我也遇到了这个问题……大约有100个实体类,7500多行代码。这个例外真的毫无帮助=/我只是想再给JPA一次机会,就遇到了这个问题。不仅是JPA本身很容易使用错误,当你这样做时,它并不能帮助你解决问题…这类似于问题,添加解释,它将是有效的答案。只有链接的答案是一个糟糕的做法