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
相关产品推荐
相关产品推荐

