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

Hibernate 6移除@TypeDef后,Duration映射PostgreSQL interval如何替换?

替换Hibernate 6中移除的@TypeDef实现Duration到PostgreSQL Interval的映射

Hibernate 6移除了@TypeDef注解,对于你原来通过该注解全局映射Duration到PostgreSQL的interval类型的需求,可以通过以下两种方式替代:

一、全局默认映射(对应原@TypeDef的defaultForType效果)

如果希望所有Duration类型的属性都自动映射到PostgreSQL的interval列,有两种配置方式:

1. 配置文件方式

在你的持久化配置文件(如application.properties、hibernate.cfg.xml)中添加类型映射配置:

# Spring Boot环境下
spring.jpa.properties.hibernate.type.preferred_for_java_type=java.time.Duration:org.hibernate.type.PostgreSQLIntervalType

# 原生Hibernate环境下
hibernate.type.preferred_for_java_type=java.time.Duration:org.hibernate.type.PostgreSQLIntervalType

2. 编程式注册

通过自定义Hibernate元数据构建器来注册全局类型映射:

public class CustomHibernateConfig {
    public void configureMetadata(MetadataBuilder metadataBuilder) {
        metadataBuilder.applyTypes(typeContributions -> {
            // 将Duration类型与PostgreSQLIntervalType绑定
            typeContributions.contributeType(PostgreSQLIntervalType.INSTANCE, Duration.class);
        });
    }
}

二、字段级局部映射(仅针对特定字段)

如果不需要全局生效,只想为单个Duration字段指定映射规则,可以直接在字段上使用@JdbcType和@SqlType注解:

修改你的字段定义如下:

@Column(name = "period", columnDefinition = "interval")
@Getter(AccessLevel.NONE)
@JdbcType(PostgreSQLIntervalJdbcType.class)
@SqlType("interval")
private Duration workedOutTime = Duration.between(createdAt.toLocalTime(), createdAt.toLocalTime());

注意:Hibernate 6中PostgreSQLIntervalType已重构为PostgreSQLIntervalJdbcType,需导入包org.hibernate.type.descriptor.jdbc.PostgreSQLIntervalJdbcType

额外提示

Hibernate 6对Java 8+的时间类型内置了更完善的自动映射支持,如果你的PostgreSQL驱动版本在42.2及以上,可以尝试直接保留@Column(columnDefinition = "interval"),移除原有的类型注解,Hibernate会自动完成Duration到interval的映射,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:55:11