将时间戳字段保留为Date或Long?

时间:2012-03-29 09:19:53

标签: jpa persistence timestamp

我需要就持久时间戳的做法达成共识,特别是对于专业人士和时间戳。与使用java.util.Date相比,使用long的利弊。

本讨论的范围:

  • 性能
  • 查询灵活性(例如日期范围)
  • 编码和查询中的任何危险
  • 可移植性(例如,迁移到其他数据库)

关于我自己: 我认为自己是JPA的初学者,偶尔涉足它,直到现在才能将它应用到生产级项目中。在我目前的项目中,我承诺通过JPA调用使用ObjectDB(嵌入式)。

3 个答案:

答案 0 :(得分:6)

以下类演示了在JPA中保留时间戳的3种可能方法:

@Entity
public class Timestamps {
    private java.sql.Timestamp ts1;
    private @Temporal(TemporalType.TIMESTAMP) java.util.Date ts2;
    private long ts3;
    :
}

关于性能和内存消耗,ts3更有效率。

ts3使用起来可能不如ts1和ts2(在ObjectDB数据库资源管理器,报告等中)。

所有三者都支持基本查询,例如按日期范围检索,但ts3不支持在查询中提取日期和时间部分(年,月等)。

所有这些表格都应该是便携式的。

ts1和ts2几乎相同。

ObjectDB manual中提供了更多详细信息。

答案 1 :(得分:0)

在java的文档中,时间戳看起来与java.util.date

更为相关

http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Timestamp.html

另外,如果您关心代码的语义,时间戳就是日期。

答案 2 :(得分:0)

在使用之前,您应该了解 java.sql.Timestamp 的事实:

Java平台库中有一些类可以扩展实例化 class并添加一个值组件。例如,java.sql.Timestamp 扩展java.util.Date并添加纳秒字段。等于实施 对于时间戳,确实违反了对称性,并且如果可能导致不稳定的行为 Timestamp和Date对象在同一个集合中使用,或以其他方式混合使用。 Timestamp类有一个免责声明警告程序员 混合日期和时间戳。虽然你不会遇到麻烦,只要你 让它们分开,没有什么可以阻止你混合它们,而且 产生的错误可能很难调试。 Timestamp类的这种行为是一个 错误,不应该被模仿。 (Bloch,Effective Java,2nd Ed。)