EclipseLink 全局“@Converter”
EclipseLink global `@Converter`
感谢 this thread,我能够使用 JPA EclipseLink 为 org.joda.time.DateTime
注册和使用自定义 Converter
。这是一个示例使用(仅相关部分):
@Converter(name = "jodaTimeConverter", converterClass = JodaDateTimeConverter.class)
public class MyEntity{
@Column(name = "creationdate")
@Temporal(TemporalType.TIMESTAMP)
@Convert("jodaTimeConverter")
private DateTime creationdate;
}
我有很多实体 类,其中大部分都有一个 DateTime
字段。因此,我的问题是:是否可以在某处注册转换器一次,以便所有 DateTime
字段是自动转换 ?
我显然可以 复制粘贴 注释无处不在,但更 DRY 的方法将不胜感激。
您尝试使用的是一种专有机制,只能在 EclipseLink 中使用,因此您的代码不可移植。
如果使用 JPA 2.1,更好的选择是使用 AttributeConverter
,并将转换器本身设置为 "autoApply"。这意味着它将应用于指定类型的所有字段,而无需注释每个字段。这样你也可以获得便携性
如果您正在使用 spring 启动和 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 ;
}
}
}
感谢 this thread,我能够使用 JPA EclipseLink 为 org.joda.time.DateTime
注册和使用自定义 Converter
。这是一个示例使用(仅相关部分):
@Converter(name = "jodaTimeConverter", converterClass = JodaDateTimeConverter.class)
public class MyEntity{
@Column(name = "creationdate")
@Temporal(TemporalType.TIMESTAMP)
@Convert("jodaTimeConverter")
private DateTime creationdate;
}
我有很多实体 类,其中大部分都有一个 DateTime
字段。因此,我的问题是:是否可以在某处注册转换器一次,以便所有 DateTime
字段是自动转换 ?
我显然可以 复制粘贴 注释无处不在,但更 DRY 的方法将不胜感激。
您尝试使用的是一种专有机制,只能在 EclipseLink 中使用,因此您的代码不可移植。
如果使用 JPA 2.1,更好的选择是使用 AttributeConverter
,并将转换器本身设置为 "autoApply"。这意味着它将应用于指定类型的所有字段,而无需注释每个字段。这样你也可以获得便携性
如果您正在使用 spring 启动和 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 ;
}
}
}