使用EclipseLink和Postgres的Joda时间使得时间从DateTime消失

时间:2014-06-10 15:37:12

标签: postgresql datetime jpa eclipselink jodatime

我有以下实体:

@Entity
public class Deal { 
    @Column(nullable = false, insertable = false, columnDefinition = "timestamp default current_timestamp")
    @Temporal(value = TemporalType.TIMESTAMP)
    private Date createdOn;
    @Column(nullable = false, insertable = false, columnDefinition = "timestamp default current_timestamp")
    @Temporal(value = TemporalType.TIMESTAMP)
    @Convert(converter = DateTimeConverter.class)
    private DateTime updatedOn;
    // rest of the fields

    public Date getCreatedOn() {
        return createdOn;
    }

    public DateTime getUpdatedOn() {
        return updatedOn;
    }

    @PrePersist
    public void onCreate() {
        this.updatedOn = new DateTime();
        this.createdOn = new Date();
    }

    @PreUpdate
    public void onUpdate() {
        this.updatedOn = new DateTime();
    }
    // etc etc..
}

DateTimeConverter.java:

@Converter(autoApply = true)
public class DateTimeConverter implements AttributeConverter<DateTime, Date> {

    @Override
    public Date convertToDatabaseColumn(DateTime dateTime) {
        return dateTime == null ? null : new Date(dateTime.getMillis());
    }

    @Override
    public DateTime convertToEntityAttribute(Date date) {
        return date == null ? null : new DateTime(date);
    }
}

正如您所看到的,这些只是记录相关字段,没有什么特别之处。它们不同的原因(一个是java.util.Date,另一个是joda.DateTime)是为了显示JodaTime正在生成的错误

在我的postgres数据库中,我有这个实例(为简单起见省略了其他列):

id |        createdon           |      updatedon
1  | 2014-06-10 15:44:28.233027 | 2014-06-10 15:44:28.233027

如您所见,正确存储了时间戳。

问题是createdOn是从数据库中正确获取的,但是更新完全失去了它的时间部分没有明显的原因。

在我获取一些实例之后,这两个值在调试器中看起来像这样:

  • createdOn :Tue Jun 10 16:44:44 CEST 2014
  • updatedOn :2014-06-10T00:00:00.000 + 02:00

有趣的是,即使在 DateTimeConverter 类的 convertToEntityAttribute 方法中,时间值也已丢失:

  • 日期 :2014-06-10

修改: 为清楚起见,我的目标是使用joda DateTime对象而不是常规Date对象,因为它们通常更容易使用。看起来,由于某种原因,它们无法正确存储数据库值。

任何想法为什么?

0 个答案:

没有答案