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

Hibernate中自定义数据库类型与实体类@Column属性的类型映射方法

Hibernate完全可以实现你的需求,根据你使用的Hibernate版本选择对应方案即可。

方案1:Hibernate 6+ 原生映射(无需额外配置)

Hibernate 6及以上版本内置了java.time.Duration类型的默认映射规则,会自动将Duration类型字段映射为数据库BIGINT类型,存储数值为秒级时长,和你的需求完全匹配,直接在实体类声明对应字段即可:

@Entity
@Table(name = "times")
public class TimeEntity {
    // 其余字段省略
    @Column(name = "duration")
    private Duration duration;

    //  getter、setter方法省略
}
方案2:Hibernate 5及更低版本 自定义类型转换器

如果使用的是低版本Hibernate,你可以通过自定义AttributeConverter实现类型自动转换:

  1. 首先创建转换器类
// Spring Boot 3.x+使用jakarta包,Spring Boot 2.x及更早版本将jakarta替换为javax即可
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import java.time.Duration;

// autoApply设为true后,项目中所有Duration类型的字段都会自动应用该转换器,无需单独给字段加注解
@Converter(autoApply = true)
public class DurationSecondConverter implements AttributeConverter<Duration, Long> {

    // 写入数据库时调用:将Duration转为秒级长整型
    @Override
    public Long convertToDatabaseColumn(Duration duration) {
        return duration == null ? null : duration.toSeconds();
    }

    // 读取数据时调用:将秒级长整型转为Duration对象
    @Override
    public Duration convertToEntityAttribute(Long seconds) {
        return seconds == null ? null : Duration.ofSeconds(seconds);
    }
}
  1. 实体类直接声明字段即可(如果未设置autoApply = true,需要给字段加上@Convert(converter = DurationSecondConverter.class)注解)
@Column(name = "duration")
private Duration duration;
注意事项
  • 你当前使用Flyway维护表结构的方案无需调整,BIGINT类型和转换器的输入输出完全匹配,无需修改DDL,也不需要开启Hibernate自动建表功能,二者无冲突。
  • 转换器已做了空值兼容处理,字段为null时不会触发空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:24:02