Java 将具有DateTime字段的实体持久化到objectdb数据库中

Java 将具有DateTime字段的实体持久化到objectdb数据库中,java,jodatime,objectdb,Java,Jodatime,Objectdb,我想将类的一个实例持久化到中 使用hibernate,我只需要用一个附加的注释对字段进行注释 @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") 但是因为我想使用objectdb,所以我不能使用这些注释,所以我得到了一个异常(“尝试存储不可持久类型org.joda.time.DateTime的实例”) 问题是objectdb禁用了对可序列化类型的“支持”。() 我很确定他们这样做是有充分理由的,所以我想

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

使用hibernate,我只需要用一个附加的注释对字段进行注释

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
但是因为我想使用objectdb,所以我不能使用这些注释,所以我得到了一个异常(“尝试存储不可持久类型org.joda.time.DateTime的实例”)

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

作为目前的解决办法,我使用了一个前置和后置挂钩

@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());
}

我的问题:还有别的办法吗?我想去掉额外的日期字段。

在Joda中,
DateTime
是一个瞬间,就像Java API
date
是一个瞬间一样。这两者之间的主要区别在于日期不是一成不变的

由于这两种类型都是长整数的包装器,表示自1970年UTC 1月1日以来经过的毫秒数,因此您可以选择根本不保存
DateTime
,而是保存它包装的长整数

以下是Joda Javadoc的摘录:

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

只要应用程序使用的时间顺序是常量或始终已知,就可以使用以下命令从长整数字段轻松重新生成日期时间:

DateTime dt = new DateTime(longInstantFieldInMillis, myChronology);
我很确定他们这样做是有充分理由的,所以我想保持这种方式

嗯。在数据库中保存序列化对象时,查询将无法对该对象执行任何测试;e、 g.测试一个日期是否晚于另一个日期。此外,您使应用程序容易受到不兼容串行版本问题的攻击。(在这个具体的例子中,这可能不是一个问题,但这个问题在很多问题中反复出现…)

我的问题:还有别的办法吗?我想去掉额外的日期字段


不幸的是,我认为没有。

这与这个问题有什么关系?@StephenC:为什么没有?他问我如何坚持约会时间,我提出了另一个选择。他要求提供一种不涉及额外字段的数据时间持久化方法。他想去掉那个额外的字段。坚持时间戳(long)也是我最初的想法之一。但是我想使用一个面向对象的数据库。所以,当我用一个原始字段隐藏信息(日期)时,这对我来说毫无意义。@StephenC:嗯,好吧。。。他可以通过将瞬间持久化为一个长整数而不是DateTime来摆脱额外的日期字段。诚然,这种解决方案需要更改数据模型,这可能是不可行的,例如,如果数据库已经非常大。我的偏好总是将瞬间作为基本体持久化。持久化DateTime可能会导致在数据库中持久化相同的年表对象数千次或几十万次。如果时间顺序总是已知的或恒定的,则不需要这种冗余。因此,存储的日期取决于jvm运行所在机器的默认时区?有一天,一个系统管理员改变了时区,你开始得到过去发生的事件……我已经告诉过你,这只是一个快速代码示例,没有有效的代码。是的,j.u.Date是一个错误的候选人,但为了这个问题:它不在乎。所以,请不要因为不属于这个问题的东西而责备我。
DateTime dt = new DateTime(longInstantFieldInMillis, myChronology);