You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何已实现Serializable的Articles类抛出Hibernate反序列化异常?

解决JPA实体类序列化异常:org.hibernate.type.SerializationException: could not deserialize

先贴出你提供的实体类代码,方便定位问题:

@Table(name="Article") 
@Access(value = AccessType.FIELD) 
public class Articles implements Serializable { 
    private static final long serialVersionUID = -6652995014527706545L; 
    
    public Articles() { 
        OffsetDateTime dateTime = OffsetDateTime.now(); 
        // Timestamp timestamp = Timestamp.valueOf(dateTime.atZoneSameInstant(ZoneId.of("Z")).toLocalDateTime()); 
        this.timeStamp = dateTime; 
    } 
    
    @Column(name = "timeStamp") 
    @Access(value = AccessType.FIELD) 
    private OffsetDateTime timeStamp; 
    
    public OffsetDateTime getTim... // 推测是未写完的getTimestamp()方法
}

我帮你分析几个最可能导致这个异常的原因,以及对应的解决办法:

1. Hibernate对Java 8 OffsetDateTime的序列化支持不足

早期版本的Hibernate(5.2之前)对Java 8引入的日期时间API(比如OffsetDateTime、LocalDateTime)没有原生支持,默认的序列化机制无法正确处理这类类型,就会抛出反序列化异常。

解决办法:

  • 先确认你的Hibernate版本是否在5.2及以上,如果不是,建议升级到支持Java 8时间类型的版本。
  • 即使版本符合要求,也可以给timeStamp字段显式指定Hibernate的类型注解,确保序列化/反序列化逻辑正确:
    @Column(name = "timeStamp")
    @Type(type = "org.hibernate.type.OffsetDateTimeType")
    private OffsetDateTime timeStamp;
    

2. 数据库字段类型与实体类型不匹配

OffsetDateTime是带时区信息的日期时间类型,如果你的数据库中timeStamp字段用的是不带时区的类型(比如MySQL的DATETIME、PostgreSQL的TIMESTAMP),Hibernate在把数据库中的值反序列化为OffsetDateTime时,会因为时区信息缺失或类型不兼容抛出异常。

解决办法:

  • 检查数据库表结构:把timeStamp字段修改为带时区的类型,比如MySQL用TIMESTAMP,PostgreSQL用TIMESTAMPTZ。
  • 如果无法修改数据库,那可以把实体类中的OffsetDateTime改为不带时区的LocalDateTime,并在构造函数中做转换(就像你注释掉的代码那样):
    public Articles() {
        OffsetDateTime dateTime = OffsetDateTime.now();
        this.timeStamp = dateTime.atZoneSameInstant(ZoneId.of("Z")).toLocalDateTime();
    }
    // 注意这里要把字段类型也改成LocalDateTime
    @Column(name = "timeStamp")
    private LocalDateTime timeStamp;
    

3. 序列化版本号与序列化对象不匹配(可能性较低)

虽然你已经定义了serialVersionUID,但如果实体类的结构(比如新增/删除字段、修改字段类型)发生过变更,而你尝试反序列化的是旧版本实体类生成的对象,也会触发这个异常。不过从你的代码来看,这个概率不大,但可以排查一下是否存在这种情况。

4. 构造函数的初始化逻辑冲突

你的无参构造函数直接给timeStamp赋值,Hibernate在实例化实体时,有时候会通过反射调用无参构造函数,再单独设置字段值,虽然一般不会有问题,但也可以尝试把初始化逻辑移到@PostConstruct方法中,避免潜在的冲突:

@PostConstruct
public void initTimestamp() {
    this.timeStamp = OffsetDateTime.now();
}

内容的提问来源于stack exchange,提问作者Samttha Biby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:40:08