【问题标题】:Absence of @Temporal annotation in hibernate休眠中缺少@Temporal 注释
【发布时间】:2023-03-10 23:13:01
【问题描述】:

如果我们使用

@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 的比较...问候。

标签: java hibernate jakarta-ee


【解决方案1】:

我只找到了一份文档:

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

来自2.2.2.1. Declaring basic property mappings

可能表明数据库中的实际日期表示尚未定义,因此最好直接指定它。

【讨论】:

  • +1 - 我也没有找到更多关于如果没有指定 @Temporal 时 Hibernate 会做什么的片段。作为补充 - EclipseLink 甚至不允许您定义时间精度。我更愿意定义您期望的精确度。
【解决方案2】:

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

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

长话短说,请始终添加此注释,以免您准备付出代价。

【讨论】:

  • 用实时例子很好的解释。泰!
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多