在休眠中缺少@Temporal注释

时间:2011-12-12 11:58:28

标签: java hibernate java-ee

如果我们使用

怎么办?
@Column(name="birth_date", nullable=false, length=19)
public Date getBirthDate() {
    return this.birthDate;
}

而不是

@Temporal(TemporalType.TIMESTAMP)
@Column(name="birth_date", nullable=false, length=19)
public Date getBirthDate() {
    return this.birthDate;
}

如果我们使用没有@Temporal注释的日期列属性,是否有任何副作用?

2 个答案:

答案 0 :(得分:29)

我设法找到的只有一些文档:

  

在普通Java API中,未定义时间的时间精度。处理时态数据时,您可能希望描述数据库中的预期精度。时态数据可以具有DATE,TIME或TIMESTAMP精度(即实际日期,仅时间或两者)。使用@Temporal注释来微调它。

来自2.2.2.1. Declaring basic property mappings

可能表示未定义数据库中的实际日期表示,并确保最好直接指定它。

答案 1 :(得分:22)

我意识到这个问题已经得到了回答,但我们今天仍在努力解决这个问题,所以我想为未来偶然发现这一点的人提供更多见解。

如果不使用时态注释,则将Oracle 11g与版本11驱动程序一起使用,那么Oracle中的每个日期,时间和时间戳数据类型都将在运行时映射到代码中的时间戳。功能上这很好,但这导致我们严重的性能问题。这是因为我们将DATE类型作为复合主键的一部分。此列是索引的前导列以及我们用于分区的列。当驱动程序尝试在where子句中使用此列保留记录时,Oracle将执行DB中数据从DATE到TIMESTAMP的类型转换。这使得索引无用,性能也很糟糕。

长篇故事,加上这个注释总是为了让你准备付出代价。