You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Hibernate仅查询却生成Update语句问题及疑惑

问题:只读查询触发Site实体UPDATE语句的排查与解决

问题场景

我有一个直接在POST路由处理器中调用的事务方法,代码如下:

@Transactional(readOnly = false)
public boolean findInsideTransaction(long titleId, Package parsedDcpPackage, String site) {
    Site siteEntity = siteRepository.findByName(site)
                .orElseThrow(() -> new ResourceNotFoundException(Site.class));
    return true;
    // 待编写更多插入逻辑
}

对应的Site实体类代码:

@Getter
@Setter
@Entity
@Table(name = "site", schema = "public")
public class Site extends BaseEntity {
    private String name;


    @JdbcTypeCode(SqlTypes.JSON)
    @Audited
    @Column(name = "configuration", columnDefinition = "jsonb")
    private SiteConfiguration configuration;
}

使用hypersistence-utils-hibernate追踪SQL语句生成栈,同时结合Hibernate Envers,发现上述仅执行查询操作的事务中,居然生成了update public.site set configuration=?,name=? where id=?语句。

已尝试的排查步骤

  • 禁用Envers,问题依旧存在;
  • 将事务注解改为@Transactional(readOnly = true),UPDATE语句消失;
  • 检查Site实体所有关联列的cascade属性,均设置为none。

解决方案与疑问

我原本对此困惑不解,寻求排查方向,后续找到了解决方案:为jsonb类型的configuration字段添加@Type(JsonBinaryType.class)注解。但不清楚该修复的原理及问题的根本成因。

版本信息

  • Spring Boot 3.4.5
  • Postgres 16.8

内容的提问来源于stack exchange,提问作者Shady Atef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:37:03