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

升级Spring Boot3.2.1后启动报错:关联列属性需一致

问题:Spring Boot 3.2.1(Hibernate 6.4.1)升级后多对多关联启动报错

升级项目到Spring Boot 3.2.1(对应Hibernate 6.4.1)后,启动应用触发以下错误:

集合属性com.acme.demo.common.QueryType.queryStatus上的关联列'query_type_id'必须定义相同的insertable和updatable属性

相关实体类代码如下:

@Data
@Entity
@Table
public class QueryType {

    @Id
    @SequenceGenerator
    @GeneratedValue
    private Long QueryTypeId;

    private String code;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "queryType")
    private Set<Query> queries = new HashSet<>(0);

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "QUERY_STATUS_TYPE", schema = "", joinColumns = { @JoinColumn(name = "QUERY_TYPE_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "QUERY_STATUS_ID", nullable = false, updatable = false) })
    private Set<QueryStatus> queryStatus = new HashSet<>(0);

}

@Data
@Entity
@Table
@DiscriminatorColumn(name = "QUERYTYPE_CODE", discriminatorType = DiscriminatorType.STRING)
public abstract class QueryStatus {

    @Id
    @SequenceGenerator
    @GeneratedValue
    @NotNull
    private Long queryStatusId;

    private String code;

    private String description;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "queryStatus")
    private Set<Query> queries = new HashSet<>(0);

}

另有若干类继承自QueryStatus,此前使用Spring Boot 3.2.0(对应Hibernate 6.3.1)时代码运行正常,升级后突然出现该错误。


原因及解决方案

原因

Hibernate 6.4.x(随Spring Boot 3.2.1升级)对多对多关联的映射属性一致性校验做了强化。你在@JoinColumn中手动设置了updatable=false,结合QueryStatus的继承结构,Hibernate的新校验逻辑认为关联列的insertable和updatable属性存在不一致,从而抛出错误。而Hibernate 6.3.1(Spring Boot 3.2.0)的校验逻辑相对宽松,允许这种配置存在。

解决方案

方案一:移除不必要的属性设置(推荐)

多对多关联的中间表维护逻辑由Hibernate默认处理,手动设置nullable=false和updatable=false属于冗余配置,反而触发校验冲突。修改后的@ManyToMany代码如下:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "QUERY_STATUS_TYPE", 
           joinColumns = { @JoinColumn(name = "QUERY_TYPE_ID") }, 
           inverseJoinColumns = { @JoinColumn(name = "QUERY_STATUS_ID") })
private Set<QueryStatus> queryStatus = new HashSet<>(0);

方案二:保持属性一致性(特殊场景使用)

如果业务上确实需要控制关联列的可更新性,需确保关联两端的insertable和updatable属性完全一致。不过对于多对多关联,这种场景极少,通常不推荐手动干预。


内容的提问来源于stack exchange,提问作者robert trudel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:54:54