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


101

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

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

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


3
如果您使用Calendar作为Entity属性,那么在纯Java中它会打印很多信息,例如,当您要将其保存到数据库时不需要这些信息。在这种情况下,您可以使用@Temporal(TemporalType.TIMESTAMP)之类的信息您实体中的日历日历,通过将Calendar属性上的@Temporal(TemporalType.DATE)或@Temporal(TemporalType.TIME)更改为日期或时间来存储时间戳到数据库中。
user3487063 2014年

Answers:


104

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

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

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

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

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

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

根据javadocs,

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

[以上信息来自各种来源]


为什么不能将其与Java类型的Timestamp一起使用?
powder366 '16

3
因此,如果您仅使用TemporalType.TIMESTAMP ...,使用该注释是否有任何意义?日期似乎做工精细,为此没有它..
Amalgovinus

我如何以以下格式存储在MySql DB中yyyy-MM-dd
Shantaram Tupe

@shantaram_t 可能会帮助您
Ankur Singhal

1
我输入了:02/10/2017并且想要将其转换为2017-10-022017/10/02
Shantaram Tupe

42

@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存储在数据库中,则
可以使用/ define TemporalType

@Temporal(TemporalType.DATE)
private Date joinedDate;

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

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


默认值为TemporalType.DATE。不知道为什么要提供带有时间部分的非注释属性值。
西蒙逻辑

如果两个日期相同,则上述方面将正常工作(TemporalType.DATE)。
Lova Chittumuri


10

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

支持时间类型的列表包括三个java.sql类型java.sql.Datejava.sql.Time以及java.sql.Timestamp,它包括两种java.util类型java.util.Datejava.util.Calendar

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

java.util但是,这两种类型需要其他元数据,以指示java.sql在与JDBC驱动程序进行通信时使用哪种JDBC 类型。这是通过用注释对它们进行@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;
}

4

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

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

资料来源:Baeldung


3

我使用的是Hibernate 5.2,@Temporal现在不再需要了。
java.util.datesql.datetime.LocalDate以适当的数据类型作为Date / timestamp存储到DB中。


那么该如何解决,如果我们只希望使用Hibernate 5.x的保存日期
KMS

Java 8 LocalDate的使用
Josh

1

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

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.