休眠时缺少@Temporal注释

2022-09-01 16:59:05

如果我们使用

@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


答案 1

我设法找到的唯一一段文档:

在普通的 Java API 中,没有定义时间的时间精度。处理时态数据时,可能需要描述数据库中的预期精度。时态数据可以具有日期、时间或时间戳精度(即实际日期、仅时间或两者)。使用@Temporal注释对其进行微调。

2.2.2.1.声明基本属性映射

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


答案 2

我意识到这个问题已经得到了回答,但我们今天为此苦苦挣扎,所以我想为将来偶然发现这个问题的人提供更多的见解。

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

长话长话,总是添加这个注释,以免你们准备付出代价。


推荐