SpringBoot集成Hibernate时UpdateTimestamp注解引发HHH000502警告如何解决?
解决Hibernate HHH000502警告的方案
问题原因
你用@UpdateTimestamp(source = SourceType.DB)标记的receivedOn字段由数据库负责更新,但Kotlin的val修饰符让该属性不可变。Hibernate在实体更新后,会尝试同步数据库返回的最新时间值到实体,但发现属性不可修改,因此抛出该警告。
具体解决办法
方案一:修改字段为var并限制外部修改
将val改为var,同时通过private set禁止外部代码修改该字段,只允许Hibernate通过反射更新。另外添加updatable = false告诉Hibernate不要将该字段纳入UPDATE语句(因为由数据库维护):
@field:[Column(name = "receivedOn", columnDefinition = "timestamptz", updatable = false) UpdateTimestamp(source = SourceType.DB)] var receivedOn: OffsetDateTime? = null private set
方案二:标记字段为只读(Hibernate 6+支持)
Spring Boot 3.x默认配套Hibernate 6.x,可使用@ReadOnly注解标记该字段,明确告知Hibernate该字段仅从数据库读取,不需要应用程序更新:
@field:[Column(name = "receivedOn", columnDefinition = "timestamptz") UpdateTimestamp(source = SourceType.DB) ReadOnly] val receivedOn: OffsetDateTime? = null
方案三:关闭特定警告(临时方案)
如果不想修改实体代码,可通过日志配置关闭该警告。在application.properties中添加:
# 关闭HHH000502所属的日志输出 logging.level.org.hibernate.event.internal.DefaultFlushEntityEventListener=ERROR
内容的提问来源于stack exchange,提问作者ivan
相关产品推荐
相关产品推荐

