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实现类型自动转换:
- 首先创建转换器类
// 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); } }
- 实体类直接声明字段即可(如果未设置
autoApply = true,需要给字段加上@Convert(converter = DurationSecondConverter.class)注解)
@Column(name = "duration") private Duration duration;
注意事项
- 你当前使用Flyway维护表结构的方案无需调整,
BIGINT类型和转换器的输入输出完全匹配,无需修改DDL,也不需要开启Hibernate自动建表功能,二者无冲突。 - 转换器已做了空值兼容处理,字段为null时不会触发空指针异常。
内容的提问来源于stack exchange,提问作者LBald
相关产品推荐
相关产品推荐

