当前位置: 首页 > 知识库问答 >
问题:

Postgres中不带时区默认CURRENT_TIMESTAMP的字段TIMESTAMP的JPA模型类?

计均
2023-03-14

我已经在Postgres表下面,并使用Java8和Postgres-11与Spring Boot2.1.6.RELEASE.我已经通过了这个问题和这个问题,但我真的想使用Java8 Date API,而不是Java7。

CREATE TABLE note(
    note_id serial PRIMARY KEY,
    message varchar(255) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

我创建了如下所示的模型类,但与我需要的不匹配。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Entity
public class Note extends AuditEnabledEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "note_id")
    private int noteId;
    
    @Column(name = "message")
    private String message;
    
    @Column(name = "created_at")
    private LocalDateTime createdAt;
}

共有1个答案

马煌
2023-03-14

本地日期时间在这里是错误的类型。该类不能表示一个时刻,正如其Javadoc中所解释的那样。

该类故意没有时区或与UTC的偏移量的概念。因此,它表示日期和一天中的时间,例如“2019年1月23日中午”,但不知道这是东京、巴黎还是蒙特利尔的中午,例如,相隔几个小时的三个非常不同的时刻。因此,这种类型适用于标准SQL类型TIMESTAMP WITHOUTime ZONE-没有,没有。

有关更多讨论,请参阅:Instant和LocalDateTime有什么区别?

对于标准SQL类型TIMESTAMP WITH TIME ZONE,您应该使用Java类型InstantOffsetDateTimeZonedDateTime。在这三种情况中,JDBC4.2只需要支持第二种OffsetDateTime

检索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

从Postgres检索到的值将始终使用UTC格式。SQL标准没有指定这种行为,因此数据库各不相同。在Postgres中,发送到TIMESTAMP和时间区域类型的字段的任何值都将调整为UTC格式。检索到的值使用UTC格式。

存储。

myPreparedStatement.setObject( … , odt ) ;

从UTC(零时差)调整到特定地区(时区)人们使用的挂钟时间。

ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

我不使用JPA,宁愿保持简单。

但是根据这个答案,JPA 2.2支持java。时间类型。

Hibernate也支持java.time。

 类似资料:
  • 问题内容: 假设我有一个模型: 目前,我正在使用默认的admin创建/编辑此类型的对象。如何从管理员中删除该字段,以使每个对象都无法使用值创建,而是将接收默认值? 问题答案: 设置为和为默认值。 http://docs.djangoproject.com/en/dev/ref/models/fields/#editable 另外,你的字段是不必要的。Django将自动添加它。

  • 问题内容: 我需要为一个表创建一个timestamp字段,该表的行在一定时间后需要过期。如果我使用以下内容: 它以一种人类可读的格式显示时间,如果我可以将时间设置为纪元时间,则可以轻松得多,这样我就可以用几秒钟的时间进行计算。有没有一种方法可以创建一个字段,当默认情况下以纪元时间创建行时,该字段将显示当前时间?谢谢! 问题答案: 您可能希望在语句中使用该函数,如以下示例所示:

  • 问题内容: 我有一个模型,希望包含一个主题名称及其首字母。(数据在某种程度上是匿名的,并且通过缩写来跟踪。) 现在,我写了 如最后一行所示,我希望能够将姓名的首字母实际作为字段(与名称无关)存储在数据库中,但是会使用基于名称字段的默认值进行初始化。但是,我遇到了问题,因为Django模型似乎没有“自我”。 如果将行更改为,则可以执行syncdb,但不能创建新主题。 在django中,有一个可调用函

  • 我需要使用一个字符串搜索postgre sql表中的所有列,但它会导致类型为“timestamp with timezone”的列出错;它显示错误:“错误:运算符不存在:没有时区的时间戳~~未知”

  • 问题内容: 我的数据库是MySql 5.6。 我想使用CURRENT_TIMESTAMP作为类型为TIMESTAMP(3)的属性的默认值。 但是我得到了错误: 错误1067(42000):“更新”的默认值无效 我认为是因为仅以秒为单位。 如何将小数部分的当前时间设置为默认值? 问题答案: 根据文档并输入列: 如果或列定义在任何地方都包含显式的小数秒精度值,则在整个列定义中必须使用相同的值。 这是允

  • 问题内容: 我们有一个带有枚举字段-的实体,我们想使用JPA注释-为它设置默认值。 但是,当我们将实体保存到数据库时,此字段的值为和。对于布尔字段- 正确的默认值()已保存。 如果改为使用:,则会在保存时得到以下异常: 我们做错了什么?为什么它仅适用于布尔值? 问题答案: 当某些SQL代码在未为emailCommunicationStatus列指定任何值的情况下插入一行时,您所做的工作很有用。在这