15

我的实体当前包含 java Date 属性。我开始经常使用 Joda Time 进行日期操作和计算。这意味着我必须不断地将我的 Dates 转换为 Joda DateTime 对象并再次转换回来。

所以我想知道,有什么理由我不应该改变我的实体来存储 Joda DateTime 对象而不是 Java Date 对象?

请注意,这些实体是通过 Hibernate 持久化的。我找到了jodatime-hibernate项目,但我也在 Joda 邮件列表上看到它与新版本的 hibernate 不兼容。而且似乎维护得不是很好。

所以我想知道是否最好继续在 Date 和 DateTime 之间进行转换,或者开始持久化 DateTime 对象是否明智。我担心的是依赖于维护不善的图书馆。

编辑:请注意,我的目标之一是能够更好地存储时区信息。仅存储日期似乎可以将日期保存在本地时区。由于我的应用程序可以在全球范围内使用,因此我还需要知道时区。Joda Time Hibernate 似乎也在用户指南中解决了这个问题。

4

4 回答 4

5

Joda Time Hibernate 可以与最近的 Hibernate 版本一起使用——您可能需要稍微调整一下依赖关系图(例如设置排除项)。我还可以建议您查看我已在 Sourceforge 上发布的用户类型。这提供了 Joda Time 的用户类型,旨在避免您提到的客户端偏移问题。我欢迎您对该项目的任何反馈。https://sourceforge.net/projects/usertype/files/

问候克里斯。

于 2010-04-30T22:55:23.680 回答
3

我认为使用 Joda DateTime 作为您的 bean 属性类型可能是一个好主意。然后,您可以让 Hibernate 进行转换并将属性保存为本地数据库日期格式。

我个人使用过 jodatime-hibernate 并且没有遇到问题(我们使用的是 Hibernate 3.2.5GA)。

如果您对 jodatime-hibernate 有疑虑,您可以随时使用Hibernate 的自定义类型映射机制(我敢肯定 jodatime-hibernate 就是这样做的)。

于 2010-02-03T02:50:37.183 回答
3

所以,总结一下:

java.util.日期

  • + Hibernate 中的本机支持
  • – 糟糕的 API

乔达时间

  • + 更好的 API
  • – Hibernate 缺乏原生支持

就个人而言,如果我可以通过仅使用第三方库(在这种情况下显然是 Hibernate 的用户类型)来保持域模型和“服务层”的清洁,那么另一种选择是编写一些额外的代码来“手动”进行转换需要的时候,我会选择第三方库。

于 2011-07-15T10:00:51.323 回答
-3

不应使用高级抽象来存储日期,例如字符串 ("2009-08-07 07:43:19 ...") 或 Java 对象。自纪元以来,它们应该以毫秒为单位持续存在。Joda 时间和常规 Java 日期时间都可以为您提供自纪元以来的毫秒数。存储经过的毫秒数,并在您从数据库中读取数据时转换回对象。

持久化重量级 Date 对象而不是 long 有点像使用浮点数来表示货币金额:它通常是一种巨大的代码气味。

于 2010-02-03T02:09:40.947 回答