在这种情况下,我们只需要日期和月份,因此将使用java.time.MonthDay
(Javadocs)来表示该信息。
我们知道,我们可以为持久化创建自己的JPA对象,或者只使用java.sql.Date
对象,但这通常需要不需要的年份信息。另一种方法是调用.atYear(int)
(Javadoc)方法(带有虚构的年份)并接收java.time.LocalDate
(Javadoc),它可以很容易地转换为java.sql.Date
。但这很容易在将来造成误解(也会保留年份信息)。
对于这种情况是否有一些"优雅"/假定的解决方案?或者是否有一个SQL的替代品,支持用于持久化的全新日期和时间API。
另一个例子是java.time.YearMonth
(Javadoc)。
感谢阅读!
由于SQL数据库没有与MonthDay
兼容的类型,所以使用VARCHAR
列,并简单地使用toString()
和MonthDay.parse()
。
或者使用自定义的DateTimeFormatter
,如果你不喜欢--12-03
格式。
默认格式将正确排序,作为字符串。
代码片段如下:
//column define:
@Column(name = "date", columnDefinition = "mediumint", nullable = false)
@Convert(converter = MonthDayIntegerAttributeConverter.class)
protected MonthDay date;
//转换器定义:
public class MonthDayIntegerAttributeConverter implements AttributeConverter<MonthDay, Integer> {
@Override
public Integer convertToDatabaseColumn(MonthDay attribute) {
return (attribute.getMonthValue() * 100) + attribute.getDayOfMonth();
}
@Override
public MonthDay convertToEntityAttribute(Integer dbData) {
int month = dbData / 100;
int day = dbData % 100;
return MonthDay.of(month, day);
}
}