感谢this thread,我能够使用JPA EclipseLink为Converter
注册并使用自定义org.joda.time.DateTime
。以下是一个示例用法(仅相关部分):
@Converter(name = "jodaTimeConverter", converterClass = JodaDateTimeConverter.class)
public class MyEntity{
@Column(name = "creationdate")
@Temporal(TemporalType.TIMESTAMP)
@Convert("jodaTimeConverter")
private DateTime creationdate;
}
我有很多实体类,其中大多数都有 我显然可以在任何地方复制粘贴注释,但是可以欣赏更干的方法。 DateTime
字段。我的问题是:是否可以在某处注册转换器,以便所有 DateTime
字段自动转换?< / p>
答案 0 :(得分:0)
您尝试使用的是专有机制,该机制仅适用于EclipseLink,因此您的代码不可移植。
如果使用JPA 2.1,更好的选择是使用AttributeConverter
,并将转换器本身设置为&#34; autoApply&#34;。这意味着它将应用于指定类型的所有字段,而无需注释每个字段。而且你也可以获得便携性
答案 1 :(得分:0)
如果您使用的是Spring Boot和AttributeConverter。
in Application.java
@EntityScan(basePackageClasses = {Application.class, JpaConverters.class})
public class JpaConverters {
@Converter(
autoApply = true
)
public static class DateTimeOffsetToOffsetDateTimeConverter implements AttributeConverter<OffsetDateTime,
DateTimeOffset> {
@Override
public OffsetDateTime convertToEntityAttribute(DateTimeOffset dateTimeOffset) {
if (dateTimeOffset == null) {
return null;
}
OffsetDateTime utc = OffsetDateTime.ofInstant(dateTimeOffset.getTimestamp().toInstant(), UTC);
int offsetSeconds = Math.toIntExact(MINUTES.toSeconds(dateTimeOffset.getMinutesOffset()));
ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetSeconds);
OffsetDateTime offsetDateTime = utc.withOffsetSameInstant(offset);
return offsetDateTime;
}
@Override
public DateTimeOffset convertToDatabaseColumn(OffsetDateTime date) {
if (date == null) {
return null;
}
Timestamp timestamp = Timestamp.from(date.toInstant());
int offsetSeconds = date.getOffset().getTotalSeconds();
DateTimeOffset dateTimeOffset = DateTimeOffset.valueOf(timestamp, Math.toIntExact(SECONDS.toMinutes(offsetSeconds)));
return dateTimeOffset ;
}
}
}