升级Spring Boot3.3.2+Hibernate6.5.2后Liquibase脚本执行报错求助
问题原因与解决方案
核心原因:Hibernate 6.5的主键序列行为变更
Hibernate 6.5版本开始,对使用IDENTITY主键生成策略的实体,会自动将对应的序列创建为PostgreSQL标识序列(identity sequence)。这类序列与表的主键列强绑定,PostgreSQL会限制对其执行ALTER SEQUENCE ... OWNED BY语句,因为系统已经默认完成了绑定关系。
而在Hibernate 6.2及更早版本中,Hibernate不会创建这种强绑定的标识序列,生成的是普通序列,所以执行ALTER SEQUENCE修改所有权的操作可以正常执行。
适配方案
针对这个问题,有两种可行的调整方式:
- 删除冗余的Liquibase语句:如果你的主键序列与表的绑定关系不需要手动维护,直接移除脚本中的
ALTER SEQUENCE id_seq OWNED BY public.[table_name].id语句即可。Hibernate 6.5已经自动完成了序列与主键列的绑定,该语句属于冗余操作。 - 修改主键生成策略:若必须保留序列所有权的配置,可将实体类的主键生成策略从
IDENTITY改为SEQUENCE,并显式指定序列信息。这样Hibernate会生成普通序列,允许执行ALTER SEQUENCE语句。示例代码:@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq") @SequenceGenerator(name = "id_seq", sequenceName = "id_seq", allocationSize = 1) private Long id;
补充说明
Spring Boot 3.3.2本身并未直接修改序列相关逻辑,问题源于它默认适配的Hibernate 6.5.x版本带来的行为变更。
内容的提问来源于stack exchange,提问作者concept_coding
相关产品推荐
相关产品推荐

