ChatGPT解决这个技术问题 Extra ChatGPT

Hibernate 中的@Temporal 注解有什么用?

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

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

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

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

v
vphilipnyc

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

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

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

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

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

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

根据javadocs,

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

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


为什么我不能将它与 Java 类型的 Timestamp 一起使用?
因此,如果您只是使用 TemporalType.TIMESTAMP ... 使用此注释有什么意义吗?没有它,日期似乎可以正常工作。
如何以 yyyy-MM-dd 的格式存储在 MySql DB 中
@shantaram_t this 可能会对您有所帮助
我有输入:02/10/2017 并想将其转换为 2017-10-022017/10/02
a
ahmednabil88

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

日期 (java.sql.Date) 时间 (java.sql.Time) 时间戳 (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/…
E
Eric Platon

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

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

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

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

有 DATE、TIME 和 TIMESTAMP 三个枚举值来表示每种 java.sql 类型。


M
Michael Parker

用这个

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

public Calendar getCreateDate() {
    return createDate;
}

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

A
Arun Raaj

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


那么如果我们只想使用 Hibernate 5.x 保存日期,那么解决方案是什么
Java 8 LocalDate 的使用
s
skryvets

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

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

来源:Baeldung


M
Md. Samim hossain

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

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

谢谢,但我们为什么要使用它?
I
Ish

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

支持;

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