Spring 启动 Hibernate 不获取 use-new-id-generator-mappings 属性
Spring Boot Hibernate not picking up use-new-id-generator-mappings property
我正在将我的项目升级到 Spring 使用 Hibernate 5.3.18 的 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, generator = "group_link_seq")
@Column(name = "group_link_id", unique = true, nullable = false)
private Long id;
}
因此,属性 似乎没有以某种方式被占用,我正在寻找原因。我看到它出现在我的 JpaProperties bean 中。如果我更改其他属性,比如我的方言,我可以看到它们正在生效。
谁能告诉我实际读取 属性 并决定使用哪个生成器的代码,或者指出我在这里犯的一些明显错误?
如 documentation 中所述:
You need to ensure that names defined under spring.jpa.properties.*
exactly match those expected by your JPA provider. Spring Boot will not attempt any kind of relaxed binding for these entries.
For example, if you want to configure Hibernate’s batch size you must use spring.jpa.properties.hibernate.jdbc.batch_size
. If you use other forms, such as batchSize
or batch-size
, Hibernate will not apply the setting.
因此,对于您的情况,您应该使用:
spring.jpa.properties.hibernate.id.new_generator_mappings: false
另请参阅 this part 休眠文档。
我正在将我的项目升级到 Spring 使用 Hibernate 5.3.18 的 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, generator = "group_link_seq")
@Column(name = "group_link_id", unique = true, nullable = false)
private Long id;
}
因此,属性 似乎没有以某种方式被占用,我正在寻找原因。我看到它出现在我的 JpaProperties bean 中。如果我更改其他属性,比如我的方言,我可以看到它们正在生效。
谁能告诉我实际读取 属性 并决定使用哪个生成器的代码,或者指出我在这里犯的一些明显错误?
如 documentation 中所述:
You need to ensure that names defined under
spring.jpa.properties.*
exactly match those expected by your JPA provider. Spring Boot will not attempt any kind of relaxed binding for these entries.For example, if you want to configure Hibernate’s batch size you must use
spring.jpa.properties.hibernate.jdbc.batch_size
. If you use other forms, such asbatchSize
orbatch-size
, Hibernate will not apply the setting.
因此,对于您的情况,您应该使用:
spring.jpa.properties.hibernate.id.new_generator_mappings: false
另请参阅 this part 休眠文档。