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
相关产品推荐
相关产品推荐

