javax.persistence.PersistenceException:org.hibernate.type.SerializationException:无法反序列化
在hibernate中执行条件查询时,出现以下异常: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。
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本身很容易使用错误,当你这样做时,它并不能帮助你解决问题…这类似于问题,添加解释,它将是有效的答案。只有链接的答案是一个糟糕的做法