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 ;
        }
    }
}