【问题标题】:EclipseLink global `@Converter`EclipseLink 全局`@Converter`
【发布时间】:2019-05-21 23:02:50
【问题描述】:

感谢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 字段自动转换

我显然可以复制粘贴各处的注释,但更干燥的方法将不胜感激。

【问题讨论】:

  • A JPA 2.1 AttributeConverter 可以设置为“autoApply”,因此适用于相关类型的所有实例。并且使用它是可移植的,与使用 EclipseLink 扩展类不同......
  • 谢谢,这正是我想要的。您想正确回答,以便我投票吗?

标签: java jpa eclipselink converter


【解决方案1】:

您尝试使用的是仅在 EclipseLink 中有效的专有机制,因此您的代码不可移植。

如果使用 JPA 2.1,更好的选择是使用 AttributeConverter,并将转换器本身设置为“自动应用”。这意味着它将应用于指定类型的所有字段,而无需注释每个字段。有了它,你也获得了便携性

【讨论】:

    【解决方案2】:

    如果您使用的是 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 ;
            }
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多