在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。
答案 0 :(得分:25)
问题是被引用的实体有另一个对实体的引用,并且该关系没有被任何@OneToMany
注释 - 就像注释一样。
答案 1 :(得分:7)
当hibernate从数据库查询结果中获取意外类型的数据时,可能会发生此异常。例如,hibernate需要数字,而是获取字符串。
在这种情况下,在stacktrace中查找StreamCorruptedException: "invalid stream header": 74657374
异常。该数字是暗示,但您可能希望将其转换为带有ascii表的文本。 74 65 73 74将test
作为字符串。这是类似命名的表列的值,但具有完全不同的类型。所以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()
时,会产生序列化异常