EclipseLink全球`@ Converter`

时间:2017-04-06 16:42:29

标签: java jpa eclipselink converter

感谢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>

我显然可以在任何地方复制粘贴注释,但是可以欣赏更干的方法。

2 个答案:

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