【问题标题】:What is the use of the @Temporal annotation in Hibernate?Hibernate 中的@Temporal 注解有什么用?
【发布时间】:2014-08-15 20:26:45
【问题描述】:

Hibernate 文档包含以下@Temporal 注释的信息:

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

temporal precision of time is not defined 是什么意思?什么是temporal 数据及其精度?它是如何微调的?

【问题讨论】:

  • 如果你使用 Calendar 作为你的 Entity 属性,那么在纯 java 中它会打印很多信息,例如,当你想将它保存到数据库时,这些信息是不必要的。在这种情况下,你可以拥有一些东西就像您的实体中的 @Temporal(TemporalType.TIMESTAMP)Calendar 日历一样,通过在您的 Calendar 属性上更改为 @Temporal(TemporalType.DATE) 或 @Temporal(TemporalType.TIME) 将时间戳存储到您的数据库或只是日期或只是时间。跨度>
  • 从 Hibernate 5 开始,您不需要也不应该在新代码中使用 @Temporal。它用于注释Date 和Calendar 字段,但这些类设计不佳且早已过时,而是使用java.time, the modern Java date and time API 中的类。它们具有内置的预期精度,您无需对它们使用该注释。

标签: java hibernate


【解决方案1】:

必须为java.util.Date 和java.util.Calendar 类型的持久字段或属性指定此注释。只能为这些类型的字段或属性指定。

Temporal 注释可以与Basic 注释、Id 注释或ElementCollection 注释结合使用(当元素集合值属于这种时间类型时。

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

时态数据是与时间相关的数据。例如,在内容管理系统中,文章的创建日期和最后更新日期是时间数据。在某些情况下,时间数据需要精确,而您希望在数据库表中存储精确的日期/时间或两者 (TIMESTAMP)。

核心 Java API 中未指定时间精度。 @Temporal 是一个JPA 注释,在时间戳和java.util.Date 之间来回转换。它还将time-stamp 转换为时间。例如,在下面的 sn-p 中,@Temporal(TemporalType.DATE) 丢弃了时间值,只保留了日期。

@Temporal(TemporalType.DATE)
private java.util.Date creationDate;

根据 javadocs,

在查询中声明适当的 {@code TemporalType} 的注解 方法参数。请注意,此注解只能用于 {@link Date} 类型的参数,默认为TemporalType.DATE

[以上信息从各种来源收集]

【讨论】:

  • 为什么不能和Java类型的Timestamp一起使用?
  • 因此,如果您只是使用 TemporalType.TIMESTAMP ... 使用此注释有什么意义吗?没有它,日期似乎可以正常工作..
  • 我如何以yyyy-MM-dd的格式存储在MySql DB中
  • @shantaram_t this 可能会帮助你
  • 我输入了:02/10/2017 并希望将其转换为2017-10-02 或2017/10/02
【解决方案2】:

@Temporal 是一个 JPA 注释,可用于在数据库表中存储以下列项:

  1. 日期 (java.sql.Date)
  2. 时间 (java.sql.Time)
  3. 时间戳 (java.sql.Timestamp)

一般当我们在类中声明一个Date字段并尝试存储它时。
它将作为 TIMESTAMP 存储在数据库中。

@Temporal
private Date joinedDate;

上面的代码将存储值看起来像 08-07-17 04:33:35.870000000 PM

如果我们只想在数据库中存储 DATE,
我们可以使用/定义TemporalType。

@Temporal(TemporalType.DATE)
private Date joinedDate;

这一次,它会将08-07-17存入数据库

还有一些其他属性以及@Temporal可以根据需要使用。

【讨论】:

  • 默认值为 TemporalType.DATE。不知道为什么您提供了带有时间部分的非注释属性值。
  • 如果两个日期相同,则上述方面将起作用( TemporalType.DATE )。
  • 不要复制粘贴答案。 stackoverflow.com/questions/25333711/…
【解决方案3】:

时间类型是一组基于时间的类型,可用于持久状态映射。

支持的时间类型列表包括java.sql 三种类型java.sql.Date、java.sql.Time 和java.sql.Timestamp,并包括java.util 两种类型java.util.Date 和java.util.Calendar。

java.sql 类型完全没有麻烦。它们的行为就像任何其他简单的映射类型一样,不需要任何特殊考虑。

但是,这两种java.util 类型需要额外的元数据,以指示在与 JDBC 驱动程序通信时使用哪种 JDBC java.sql 类型。这是通过使用@Temporal 批注并将JDBC 类型指定为TemporalType 枚举类型的值来完成的。

DATE、TIME 和 TIMESTAMP 三个枚举值分别代表java.sql 类型。

【讨论】:

    【解决方案4】:

    使用这个

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="create_date")
    private Calendar createDate;
    
    public Calendar getCreateDate() {
        return createDate;
    }
    
    public void setCreateDate(Calendar createDate) {
        this.createDate = createDate;
    }
    

    【讨论】:

      【解决方案5】:

      如果您正在寻找简短的答案:

      在使用 java.util.Date 的情况下,Java 并不真正知道如何直接关联 SQL 类型。这就是@Temporal 发挥作用的时候。它用于指定所需的 SQL 类型。

      来源:Baeldung

      【讨论】:

        【解决方案6】:

        我使用 Hibernate 5.2,并且不再需要 @Temporal。
        java.util.date、sql.date、time.LocalDate 以适当的数据类型作为日期/时间戳存储到数据库中。

        【讨论】:

        • 如果我们只想使用 Hibernate 5.x 保存日期,解决方案是什么
        • Java 8 LocalDate 的使用
        【解决方案7】:

        我们使用@Temporal注解在数据库表中插入日期、时间或两者。使用TemporalType我们可以在int表中插入数据、时间或两者。

        @Temporal(TemporalType.DATE) // insert date
        @Temporal(TemporalType.TIME) // insert time
        @Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
        

        【讨论】:

        • 谢谢,但我们为什么要使用它呢?
        【解决方案8】:

        简单地说,@Temporal 是一个 Hibernate JPA 注释,只能在 java.util.Date 或 java.util.Calendar 上设置。 它有助于将日期和时间值从 Java 对象转换为兼容的数据库类型,并将其检索回应用程序。

        支持;

        @Temporal(TemporalType.TIMESTAMP)
        @Temporal(TemporalType.DATE)
        @Temporal(TemporalType.TIME)
        

        【讨论】:

          猜你喜欢
          • 2012-10-07
          • 1970-01-01
          • 2015-01-15
          • 2017-09-16
          • 2010-11-24
          • 2012-10-26
          • 2020-03-19
          • 2015-07-31
          • 1970-01-01
          相关资源
          最近更新 更多