2

我正在将我的项目升级到使用 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,默认分配大小为 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, generator = "group_link_seq")
    @Column(name = "group_link_id", unique = true, nullable = false)
    private Long id;
    
}

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

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

4

1 回答 1

4

正如文档中所述:

您需要确保在下定义的名称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

另请参阅hibernate 文档的这一部分

于 2021-02-27T12:50:09.470 回答