java JPA提取偏移日期时间与区域偏移-休眠检测保存时字段的更改

w6mmgewl  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(126)

我有一个Postgres表,其中的列created_at不断触发行更新。

created_at  TIMESTAMP WITH TIME ZONE NOT NULL

在产品实体Bean中:

@Column(name = "created_at")
@NotNull
private OffsetDateTime createdAt;

JSON中的值:

batchProduct/createdAt in JSON: 2022-06-12T06:19:26Z

使用OffsetDateTime.parseMap到实体:

product.setCreatedAt(OffsetDateTime.parse(batchProduct.getCreatedAt()));

当从同一JSON(2022-06- 12 T06:19:26 Z)加载多个时间相同的对象(CreatedAt)时,休眠检测到变化,我推测是因为数据库返回了带有我的时区偏移量的值(2022-06- 12 T08:19:26+02:00)。这是相同的时间点,只是表示不同,数据库具有+02:00和小时不同。Equal工作正常,我已经测试过:

if(product.getCreatedAt().equals(OffsetDateTime.parse(batchProduct.getCreatedAt()))){
       log.info("Product.createAt: " + product.getCreatedAt());
       log.info("BatchProduct.createAt: " + OffsetDateTime.parse(batchProduct.getCreatedAt()));
    } else {
        log.info("Product.createAt: " + product.getCreatedAt());
        log.info("BatchProduct.createAt: " + OffsetDateTime.parse(batchProduct.getCreatedAt()));
        log.info("Objects are equals");
    }

2022-06-12 12:00:10,953 [main] INFO  c.xxx.mapper.BatchObjectsMapper - Product.createAt: 2022-06-12T08:19:26+02:00
2022-06-12 12:00:10,953 [main] INFO  c.xxx.mapper.BatchObjectsMapper - BatchProduct.createAt: 2022-06-12T06:19:26Z
2022-06-12 12:00:10,953 [main] INFO  c.xxx.mapper.BatchObjectsMapper - Objects are equals

当我一遍又一遍地保存同一个对象时,它总是会触发数据库中的行更新(DB中的值是相同的),当我注解setCreatedAt(有更多属性)时,DB不会更新(hib检测到这是同一个对象),这是想要的行为。
问题是:Hibernate如何检查OffsetDateTime是否相等,因为它一直在同一个OffsetDateTime触发实体更新?

6vl6ewon

6vl6ewon1#

这不是直接回答你的问题,但它可以帮助你的问题。
您可以尝试使用Hibernate 6的新方法来处理OffsetDateTime
首先,您需要添加用于存储偏移量的列。

-- the old one with time zone
created_at  TIMESTAMP WITH TIME ZONE NOT NULL
-- and the new one
created_at_tz_offset INTEGER NOT NULL

然后将实体更改为

@Column(name = "created_at")
@NotNull
@TimeZoneStorage(TimeZoneStorageType.COLUMN)
@TimeZoneColumn(name = "created_at_tz_offset")  
private OffsetDateTime createdAt;

在此之后,OffsetDateTime值将不再依赖于JVM时区或PostgreSQL时区,不同时区的OffsetDateTime值将相同。
更多信息是这篇文章Improved OffsetDateTime and ZonedDateTime Mapping in Hibernate 6

相关问题