我们的模型中有类型为java.time.OffsetDateTime(JAVA8)的Date字段。我们正在使用Microsoft SQL Server作为数据库。数据库中的“表”列的类型为datetimeoffset。我们在应用程序中使用Hibernate作为ORM。但是我们无法使用Hibernate将java.time.OffsetDateTime字段存储到sql server datetimeoffset列中。
请让我们知道我们如何实现这一目标?
最佳答案
添加以下转换器类对我有用。第二个格式化程序可能是由于命中了旧的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);
}
}
}