0

我想将我的类的一个实例持久化到objectdb中。

@Entity
public class MyClazz {
  @Column(nullable = false)
  DateTime date;
}

使用休眠,我只需要使用附加注释来注释该字段。

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")

但是由于我想使用 objectdb 我不能使用这些注释,所以我得到一个异常(“尝试存储非持久类型 org.joda.time.DateTime 的实例”)

问题是 objectdb 禁用了对可序列化类型的“支持”。(见这里)我很确定他们这样做是有充分理由的,所以希望保持这种方式。

作为现在的解决方法,我使用 pre 和 post 钩子。

@Column(nullable = false)   
private Date date = new Date();

@Transient
private DateTime dateTime;

@PrePersist
private void persist() {
    date = dateTime.toDate();
}

@PostLoad
private void load() {
    dateTime = new DateTime(date.getTime());
}

我的问题:还有其他方法吗?我想摆脱额外的日期字段。

4

2 回答 2

0

在 Joda 中,aDateTime是一个瞬间,就像 Java APIDate是一个瞬间一样。两者之间的主要区别在于Date它不是一成不变的。

由于这两种类型都是一个长整数的包装器,它表示自 1970 年 1 月 1 日 UTC 以来经过的毫秒数,您的一种选择是根本不持久化DateTime,而是简单地保留它包装的长整数。

这是 Joda Javadoc 的摘录:

在内部,该类包含两条数据。首先,它将日期时间保存为从 Java 纪元 1970-01-01T00:00:00Z 开始的毫秒数。其次,它拥有一个 Chronology,它确定如何将毫秒瞬时值转换为日期时间字段。默认年表是 ISOChronology,这是公认的国际标准,与现代公历兼容。

只要您的应用程序使用的 Chronology 是常量或始终已知,您就可以轻松地从长整数字段重新生成 DateTime:

DateTime dt = new DateTime(longInstantFieldInMillis, myChronology);
于 2013-07-28T14:14:17.313 回答
0

我很确定他们这样做是有充分理由的,所以希望保持这种状态。

是的。当您将序列化对象保存在数据库中时,您的查询将无法对该对象执行任何测试;例如,测试一个日期是否晚于另一个日期。此外,您使您的应用程序容易受到串行版本不兼容问题的影响。(在这个特定的例子中,这可能不是问题,但这个问题在 SO 问题中反复出现......)

我的问题:还有其他方法吗?我想摆脱额外的日期字段。

不幸的是,我认为没有。

于 2013-07-28T15:00:44.847 回答