我想将我班级的一个实例保存到objectdb。
@Entity
public class MyClazz {
@Column(nullable = false)
DateTime date;
}
使用hibernate,我只需要使用额外的注释来注释该字段。
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
但是因为我想使用objectdb我不能使用这些注释,所以我得到一个异常(“尝试存储非持久性类型的实例org.joda.time.DateTime”)
问题是objectdb禁用了可序列化类型的“支持”。 (see here) 我很确定他们这样做是有充分理由所以想要保持这种方式。
作为现在的解决方法,我使用前后挂钩。
@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());
}
我的问题:还有另外一种方法吗?我想摆脱额外的日期字段。
答案 0 :(得分:0)
在Joda中,DateTime
是一个瞬间,与Java API Date
即时相同。两者之间的主要区别在于Date
不是不可变的。
由于这两种类型都是围绕一个长整数的包装器,它表示自1970年1月1日UTC以来经过的毫秒数。对你来说,一个替代方法是根本不保留DateTime
,而只是坚持它包裹的长整数。
以下是Joda Javadoc的摘录:
在内部,该类包含两个数据。首先,它将日期时间保持为1970-01-01T00:00:00Z的Java纪元的毫秒数。其次,它包含一个Chronology,它确定毫秒瞬时值如何转换为日期时间字段。默认的年表是ISOChronology,它是商定的国际标准,与现代公历相容。
只要您的应用程序使用的年表是常数或始终是已知的,您就可以使用以下方法从长整数字段轻松地重新生成DateTime:
DateTime dt = new DateTime(longInstantFieldInMillis, myChronology);
答案 1 :(得分:0)
我很确定他们这样做是有充分理由所以想要保持这种方式。
是的。在数据库中保存序列化对象时,您的查询将无法对该对象执行任何测试;例如测试一个日期是否晚于另一个日期。此外,您使应用程序容易受到不兼容的串行版本问题的影响。 (在这个具体的例子中,这可能不是问题,但问题在SO问题中反复出现......)
我的问题:还有另外一种方法吗?我想摆脱额外的日期字段。
不幸的是,我认为没有。