问题描述
我正在将我的项目升级到使用 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
。如果您使用其他形式,例如 batchSize
或 batch-size
,Hibernate 将不会应用该设置。
因此,对于您的情况,您应该使用:
spring.jpa.properties.hibernate.id.new_generator_mappings: false
另请参阅 this part 的 hibernate 文档。