我有以下实体:
@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是从数据库中正确获取的,但是更新完全失去了它的时间部分没有明显的原因。
在我获取一些实例之后,这两个值在调试器中看起来像这样:
有趣的是,即使在 DateTimeConverter 类的 convertToEntityAttribute 方法中,时间值也已丢失:
修改: 为清楚起见,我的目标是使用joda DateTime对象而不是常规Date对象,因为它们通常更容易使用。看起来,由于某种原因,它们无法正确存储数据库值。
任何想法为什么?