Hibernate中缺少@Temporal注释

26

如果我们使用什么呢?

@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注释的情况下使用日期列属性,会有什么副作用吗?


我会在这个问题中加入与f:convertDateTime的比较...敬礼。 - Rodmar Conde
2个回答

29

我找到的唯一一份文档如下:

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

引自2.2.2.1.声明基本属性映射

这可能表明数据库中的实际日期表示未定义,为确保准确性最好直接指定。


3
+1 - 我也没有找到任何更多的片段,谈论如果没有指定@Temporal,Hibernate会做什么。另外,EclipseLink甚至不允许您定义时间精度。我更喜欢定义您期望拥有的精确精度。 - Piotr Nowicki

22

我知道这个问题已经有答案,但今天我们遇到了这个问题,所以我想为将来可能会遇到这个问题的人提供更多的见解。

使用 Oracle 11g 和 11 版本的驱动程序,如果不使用时间标注,则 Oracle 中的每个日期、时间和时间戳数据类型都会在运行时映射到代码中的时间戳。功能上讲这是可以的,但这给我们带来了严重的性能问题。原因是我们有一个 DATE 类型作为复合主键的一部分。这个列是索引的主导列,也是我们用于分区的列。当驱动程序尝试将此列包含在 where 子句中持久化记录时,Oracle 将对 DB 中的数据执行从 DATE 到 TIMESTAMP 的类型转换。这使得索引无用,性能非常糟糕。

长话短说,务必总是添加此标注,否则你将准备付出代价。


好的解释,并附有实时示例。谢谢! - Diablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接