如何在 JPA 中设置 CURRENT_TIMESTAMP 的默认值

Posted

技术标签:

【中文标题】如何在 JPA 中设置 CURRENT_TIMESTAMP 的默认值【英文标题】:How to make default value of CURRENT_TIMESTAMP in JPA 【发布时间】:2021-12-03 14:26:54 【问题描述】:

这是我的实体列,名为createdDate,我通过User's phone-number 和message text 的值找到它。在 mysql 中它可以正常工作。

@Column(name = "created_date", insertable = false, updatable = false,
        columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private LocalDateTime created_date;

但一般来说,我使用 Oracle,我想像 MySQL 一样将 createdDate 值声明为 CURRENT_TIMESTAMP。我是这样添加的,效果很好。

@CreationTimestamp
@ColumnDefault("CURRENT_TIMESTAMP")
protected LocalDateTime createdDate;

但是 createdDate 的值存储到这样的表中 2021-10-15 14:46:27.219000 我不想这样,我想像这种格式将数据存储到数据库中

yyyy-MM-dd HH:mm:ss

不知何故,我没有在 JPA 中使用 Oracle 数据库给出默认值。如何解决?有什么办法可以解决或删除第二个值的结尾?

【问题讨论】:

TIMESTAMP 列根本没有任何格式。您看到的任何格式都由您在 显示 值时使用的 SQL 客户端应用。 你试过CURRENT_TIMESTAMP(0)吗? @a_horse_with_no_name 提到的内容非常重要,应该可以消除您的疑问。如果您仍有疑问,我建议您检查与 Java 中的日期时间类型相关的The standard library does not support a formatted Date-Time object.,但事实保持不变,即数据库或语言存储/处理日期时间类型的信息,而不是格式化。 【参考方案1】:

Oracle 将时间戳存储为比特包,每个比特代表特定的信息。然后,任何客户端程序都可以以他们喜欢的格式显示该值。在您的情况下,如果您想将它们显示为YYYY-MM-DD

alter session set nls_timestamp_format='YYYY-MM-DD';

如果您在 JPA 中执行此操作,并且您使用的是池,则会影响使用该池的所有连接。

例子

SQL> create table t ( c1 timestamp ) ;

Table created.

SQL> insert into t values ( systimestamp ) ;

1 row created.

SQL> select * from t ;

C1
---------------------------------------------------------------------------
15-OCT-21 01.29.45.427944 PM

SQL> select dump(c1) from t ;

DUMP(C1)
--------------------------------------------------------------------------------
Typ=180 Len=11: 120,121,10,15,14,30,46,25,129,232,64

在我的情况下,该值使用我的默认时间戳格式显示

SQL> select parameter,value from v$nls_parameters where parameter='NLS_TIMESTAMP_FORMAT' ;

PARAMETER                     VALUE                                                                     
---------------------------------------------------------------- ----------
NLS_TIMESTAMP_FORMAT          DD-MON-RR HH.MI.SSXFF AM                                                  

让我们深入了解dump 函数的这些值的含义。对于我们的时间戳15-OCT-21 01.29.45.427944 PM,我们得到了以下dump

120,121,10,15,14,30,46,25,129,232,64

世纪:(120-100)*100 = 2000 年份:(121-100) = 21(因为世纪是 2000 + 21 = 2021) 月:10 天:15 小时:14(多余 - 1)然后 13 分钟:30(超出 - 1)然后 29 第二次:46(超额 - 1)然后是 45

其余部分是存储在时间戳值中的特定秒数(请记住,Oracle 中的时间戳存储的秒数最多为纳秒)。由于转储类型为 180,因此没有关联时区。您可以在下面找到来自@Alex Poole 的惊人答案的链接,该链接更详细地解释了我刚刚在这里告诉您的内容,以及其他类型的时区时间戳。

Timestamp Bytes

【讨论】:

以上是关于如何在 JPA 中设置 CURRENT_TIMESTAMP 的默认值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPA 中设置 CURRENT_TIMESTAMP 的默认值

如何使用hibernate jpa在内存数据库中设置h2?

在@NamedQuery (JPA QL 1.0) 中设置为空的参数

Java JPA 错误;您试图从查询字符串中设置类型类数据预期类型 int 的值

如果属性对 JPA 无效,我如何在数据库中插入默认值

如何在java中设计JPA多态关系?