java.time.OffsetDateTime字段使用Hibernate

时间:2016-06-23 14:10:58

标签: hibernate datetimeoffset

我们的模型中包含类型为java.time.OffsetDateTime(JAVA8)的Date字段。我们使用Microsoft SQL Server作为我们的数据库。数据库中的Table列的类型为datetimeoffset。我们在我们的应用程序中使用Hibernate作为ORM。但是我们无法使用Hibernate将java.time.OffsetDateTime字段存储到sql server datetimeoffset列。

请告诉我们如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

添加以下转换器类对我有用。第二个格式化程序可能是由于命中旧的SQL Server数据库或旧数据,我不确定,所以您可能不需要它:

@Converter(autoApply = true)
public class OffsetDateTimeConverter implements AttributeConverter<OffsetDateTime, String> {

    private static DateTimeFormatter MAIN_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn xxx");
    private static DateTimeFormatter SECONDARY_FROM_DB_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnn xxx");

    @Override
    public String convertToDatabaseColumn(OffsetDateTime attribute) {
        if (attribute == null) {
            return null;
        }
        return attribute.format(MAIN_FORMATTER);
    }

    @Override
    public OffsetDateTime convertToEntityAttribute(String dbData) {
        if (dbData == null) {
            return null;
        }

        try {
            return OffsetDateTime.parse(dbData, MAIN_FORMATTER);
        } catch (DateTimeParseException e) {
            // Some old? data has only 7 digits for nanoseconds
            return OffsetDateTime.parse(dbData, SECONDARY_FROM_DB_FORMATTER);
        }
    }
}