【问题标题】:Issue in Hibernate and JPA with Postgres while creating a attribute with "Date" datatype在使用“日期”数据类型创建属性时,使用 Postgres 在 Hibernate 和 JPA 中出现问题
【发布时间】:2021-02-15 05:24:19
【问题描述】:

我正在尝试使用带有 Postgres 的 hibernate 和 JPA 创建一个表,并且在其中一个 POJO 中,我有一个数据类型为 Date(java.util.date) 的时间戳属性。当我在 Postgres 中看到它时,它被转换为数据类型“没有时区的日期”,而我想要带时区的日期,我现在该怎么办?

【问题讨论】:

    标签: java postgresql hibernate spring-data-jpa


    【解决方案1】:

    我们有不同类型的Date

    1. DATE 保存没有时间信息的日期,
    2. TIME 存储不带日期的时间,并且
    3. TIMESTAMP 用于存储日期和时间信息。

    为了将我们的变量映射到特定的类型,我们必须使用@Temporal标签:

    小例子:

    @Entity
    public class MyEntity {
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
         
        @Temporal(TemporalType.TIMESTAMP)
        private Date utilDate;
         
        @Temporal(TemporalType.DATE)
        private Calendar utilCalendar;
    
        // Getters, Setters ...
    }
    

    所以我建议你将它保存为 TIMESTAMP

    要在属性文件中指定时区,请使用:

    spring.jpa.properties.hibernate.jdbc.time_zone = UTC
    

    如果您不想使用@Timestamp,只需以这种方式声明您的变量/列:

    @Column
    private LocalDateTime created;
    

    Hibernate 会自动将其映射到 Postgresql 的时间戳中。

    【讨论】:

    • TemporalType 是一个更好的解决方案。另一种可能是在属性上为 columnDefinition 提供列注释,它将采用您在 columnDefinition 中提供的任何数据类型。
    • 是的,你是对的。但最好的解决方案是使用LocalDateTime,因为它是新 Time api 的一部分。不过,您的评论添加了另一个解决方案。
    猜你喜欢
    • 2012-04-09
    • 2011-10-28
    • 2017-09-17
    • 1970-01-01
    • 2015-11-30
    • 2011-07-04
    • 2016-11-21
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多