2012-03-29 71 views
4

我需要在坚持时间戳的做法上达成共识,特别是在使用java.util.Date时与使用long时相比使用弊端&。将日期或长期的时间戳记字段保留?

范围本讨论的:

  • 性能
  • 查询灵活性(例如日期范围)
  • 在编码和查询
  • 便携性(例如迁移到其它DB)
任何危害

自我简介: 我认为自己是JPA的初学者,曾经参与过一次一段时间,直到现在还不能将其应用到生产级项目中。在我目前的项目中,我承诺通过JPA调用来使用ObjectDB(嵌入式)。

回答

5

下面的类演示了用于在JPA持续时间戳3种可能的方法:

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

关于性能和内存消耗,TS3是一个比较有效的。 (在ObjectDB数据库浏览器,报表等中)ts3可能不如ts1和ts2使用方便。

基本查询,如日期范围检索,都支持所有这三种,但在查询中提取日期和时间部分(YEAR,MONTH等)不支持ts3。

所有这些形式都是可移植的。

ts1和ts2实际上是等效的。

更多细节请参见ObjectDB manual

+0

我猜日期赢得便利性和可读性,其中涉及查询。 Long可能适用于原始数据应用,例如科学的,医学的,其中查询可能罕见或者在后期收集时被调用。报告生成。 – 2012-04-02 06:53:13

0

你应该知道关于的java.sql.Timestamp的事实,在使用它之前:

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