Hibernate中@Temporal注释的用途是什么?

时间:2014-08-15 20:26:45

标签: java hibernate

Hibernate文档具有以下@Temporal注释信息:

  

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

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

8 个答案:

答案 0 :(得分:81)

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

Temporal注释可以与Basic注释,Id注释或ElementCollection注释结合使用(当元素集合值是这样的时候时间类型。

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

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

核心Java API中未指定时间精度。 @Temporal是一个JPA注释,可在时间戳和java.util.Date之间来回转换。它还将time-stamp转换为时间。例如,在下面的代码段中,@Temporal(TemporalType.DATE) 会删除时间值并仅保留日期

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

根据javadocs,

  

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

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

答案 1 :(得分:20)

@Temporal 是JPA注释,可用于仅存储 TIME java.sql.Time), DATE 数据库表中的(java.sql.Date)或 TIMESTAMP java.sql.Timestamp)。通常,当我们在类中声明Date字段并尝试存储它时。它会将时间戳存储在数据库中。

private Date joinedDate;

储值看起来像 08-07-17 04:33:35.870000000 PM

如果我们只想在数据库中存储Date,我们可以将此注释与DATE属性一起使用。

@Temporal(TemporalType.DATE)

private Date joinedDate;

这一次,它会将 08-07-17 存储在数据库中

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

答案 2 :(得分:8)

时态类型是可以在持久状态映射中使用的基于时间的类型集。

支持的时态类型列表包括三种java.sql类型java.sql.Datejava.sql.Timejava.sql.Timestamp,它包含两种java.util类型{{ 1}}和java.util.Date

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

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

有三个枚举值DATE,TIME和TIMESTAMP来表示每个TemporalType类型。

答案 3 :(得分:3)

使用此

@Temporal(TemporalType.TIMESTAMP)
@Column(name="create_date")
private Calendar createDate;

public Calendar getCreateDate() {
    return createDate;
}

public void setCreateDate(Calendar createDate) {
    this.createDate = createDate;
}

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

如果您要寻找简短的答案:

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

来源:Baeldung

答案 7 :(得分:0)

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

支持;

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