我有一个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触发实体更新?
1条答案
按热度按时间6vl6ewon1#
这不是直接回答你的问题,但它可以帮助你的问题。
您可以尝试使用Hibernate 6的新方法来处理
OffsetDateTime
首先,您需要添加用于存储偏移量的列。
然后将实体更改为
在此之后,
OffsetDateTime
值将不再依赖于JVM时区或PostgreSQL时区,不同时区的OffsetDateTime
值将相同。更多信息是这篇文章Improved OffsetDateTime and ZonedDateTime Mapping in Hibernate 6