如何使用Hibernate映射java.time.Year和其他java.time类型

2022-09-04 03:08:09

有 JAR 为几个类(如 、 等)提供适配器,但 缺少 中的一些类,例如 、 、 。这些类像一个未知的类一样被存储,这是不必要的浪费。hibernate-java8InstantLocalDatejava.timeYearMonthYearMonthSerializable

当然,我可以用 一个 代替 ,但我不认为,这是一个好主意。int yearYear year

看起来写应该很容易,但是,我想知道为什么它丢失了。特别是在的情况下,我强烈希望有一个现有的适配器,有没有?还是我在做一些愚蠢的事情?YearJavaDescriptorYearMonth

我不确定,因为谷歌搜索没有任何回报。


答案 1

尝试创建一个转换器 - 为此目的实现。AttributeConverter

我过去使用过如下内容:

@Entity
public class RealEstateAgency {
    @Column(name = "createdAt")
    @Convert(converter = ZonedDateTimeConverter.class)
    private ZonedDateTime creationDate;
}

@Converter(autoApply = true)
public class ZonedDateTimeConverter implements AttributeConverter<ZonedDateTime, Date> {
 
    public Date convertToDatabaseColumn(ZonedDateTime toConvert) {
        return toConvert == null ? null : Date.from(toConvert.toInstant());
    }
 
    public ZonedDateTime convertToEntityAttribute(Date toConvert) {
        return toConvert == null ? null : ZonedDateTime.from(toConvert.toInstant());
    }
}

答案 2

如果您的 JPA 提供程序没有以合理的方式持久化类型(在本例中,因为它是一个 Java8 类,它是在 JPA 2.1 获得批准后添加的),那么您需要定义一个 JPA 2.1 AttributeConverter 以将其转换为标准的 JPA 持久化类型(在本例中为 java.sql.Date)。


推荐