如何在 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 的默认值
在@NamedQuery (JPA QL 1.0) 中设置为空的参数