JPA EntityManager 在更新 spring-boot-starter-parent 从 2.1.3 到 2.3.11 之后。无法初始化 JPA EntityManagerFactory

JPA EntityManager After update spring-boot-starter-parent from 2.1.3 to 2.3.11. Failed to initialize JPA EntityManagerFactory

我在父 pom 中将 spring-boot-starter-parent 从 2.1.3 更新到 2.3.11。然后当我 运行 代码时出现错误: 2022-04-13 18:19:16.668 错误 24960 --- [main] j.LocalContainerEntityManagerFactoryBean:无法初始化 JPA EntityManagerFactory:[PersistenceUnit:default] 无法构建 Hibernate SessionFactory;嵌套异常是 org.hibernate.MappingException:无法实例化 ID 生成器 [entity-name= KeycodeAudit]

原因:org.hibernate.MappingException:[S_AUDITID]序列的增量大小在实体映射中设置为[50],而关联的数据库序列增量大小为[1]。 在 org.hibernate.id.enhanced.SequenceStyleGenerator.configure(SequenceStyleGenerator.java:261) ~[hibernate-core-5.4.31.Final.jar:5.4.31.Final] 在 org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:118) ~[hibernate-core-5.4.31.Final.jar:5.4.31.Final]

我是 spring 和 maven 的新手。不知道是什么原因造成的。如果我将 spring-boot-starter-parent 从 2.3.11 改回 2.1.3。那么代码又可以运行了。

我在 application.yml 中的 JPA 设置是 日本专利局: 特性: hibernate.dialect: org.hibernate.dialect.Oracle10gDialect

这是由于缺少架构造成的吗?或者别的什么?

我认为错误消息提示了验证错误,即您在实体 class 中指定的序列 allocationSize 与数据库中的序列不匹配。

我不确定您是如何配置实体 class(通过 xml 或使用注释),但是如果您使用注释,则应该配置您的 id 以下模式的字段:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "<seq name in java in generator anno>")
@SequenceGenerator(name = "<seq name in java in generator anno>", sequenceName = "<seq name in db>", allocationSize = 1) // Pay attention to here
private Long oid;

请关注SequenceGenerator中的allocationSize条目。如果您查看它的源代码,您可能会发现它是可选的,因为它提供了默认值“50”。

    /**
     * (Optional) The amount to increment by when allocating 
     * sequence numbers from the sequence.
     */
    int allocationSize() default 50;

当您在 Oracle 中定义序列时,此条目对应于 increment by。您应该手动将其指定为 1,这可能是问题的根本原因。