Spring Boot Hibernate 没有选择 use-new-id-generator-mappings 属性

问题描述

我正在将我的项目升级到使用 Hibernate 5.3.18 的 Spring Boot 2.1.18。

以前,我的实体看起来像这样并且会使用 SequenceHiLoGenerator:

@Entity
@Table(name = "group_link")
@SequenceGenerator(name = "group_link_seq",sequenceName = "group_link_seq")
public class GroupLinkEntity extends BaseObject {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "group_link_seq")
    @Column(name = "group_link_id",unique = true,nullable = false)
    private Long id 
}

现在,默认情况下,在 Hibernate 5 中,它使用 SequenceStyleGenerator,这会导致约束违规,因为我的增量大小为 1,而默认的 allocationSize 为 50。

为了保持兼容性,建议的做法是设置此属性:

spring.jpa.properties.hibernate.use-new-id-generator-mappings: false

我这样做了,但似乎没有用,因为 SequenceStyleGenerator 仍在使用。根据我的理解,这应该会导致它使用 SequenceHiLoGenerator。这是错误的吗?

但是,如果我将实体修改为如下所示,它会按预期工作,复制我以前的功能。

@Entity
@Table(name = "group_link")
@GenericGenerator(
        name = "group_link_seq",strategy = "org.hibernate.id.SequenceHiLoGenerator",parameters = {
                           @Parameter(name = "sequence_name",value = "group_link_seq"),}
       )
public class GroupLinkEntity extends BaseObject {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,nullable = false)
    private Long id;
    
}

因此,该财产似乎并未以某种方式被占用,我正在寻找原因。我看到它出现在我的 JpaProperties bean 中。如果我更改其他属性,例如我的方言,我可以看到它们正在生效。

谁能告诉我实际读取该属性并决定使用哪个生成器的代码,或者指出我在这里犯的一些明显错误?

解决方法

正如 documentation 中所述:

您需要确保在 spring.jpa.properties.* 下定义的名称与 JPA 提供程序所期望的名称完全匹配。 Spring Boot 不会尝试对这些条目进行任何类型的宽松绑定。

例如,如果要配置 Hibernate 的批处理大小,则必须使用 spring.jpa.properties.hibernate.jdbc.batch_size。如果您使用其他形式,例如 batchSizebatch-size,Hibernate 将不会应用该设置。

因此,对于您的情况,您应该使用:

spring.jpa.properties.hibernate.id.new_generator_mappings: false

另请参阅 this part 的 hibernate 文档。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...