Hibernate 为下一个序列拾取第二个先前的 id 值

Hibernate picking up second previous id value for next sequence

以下是我的实体 class、

中 ID 的配置方式
    @Entity
    @Table(name = "test_data")
    @NamedQuery(name = "TestData.findAll", query = "SELECT t FROM TestData t")
    public class TestData implements Serializable {
    @GenericGenerator(name = "testDataSequenceGenerator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
            @Parameter(name = "sequence_name", value = "test_data_Seq"),
            @Parameter(name = "initial_value", value = "1000"), @Parameter(name = "increment_size", value = "1") })
    @Id
    @GeneratedValue(generator = "testDataSequenceGenerator")
    protected Long id;
    }

我将数据保存到实现 JpaRepository 接口的 table 中。递增工作正常,直到我开发了一个新的商业解决方案,我需要根据商业需求插入 ID 值。

示例:我当前在 Postgres 数据库中的第一行 ID = 1000。因此,根据我在我的实体中完成的生成配置,我的下一行将是 1001。但是随着新的增强。我正在插入 ID = 2000。由于 JPA 不允许用户定义的 ID(我相信这是因为 ID 上的配置),我使用本机查询来使用 EntityManager 执行相同的操作。

现在这样做;一旦我 运行 根据用户输入插入 ID 的业务工作流程。稍后当我尝试创建一个新条目时,hibernate 通过使用先前创建的 ID 递增,即 1001,而不是 2001。

这是因为休眠中的任何缓存吗?我需要更新休眠中的下一个值吗?你能帮我一下吗?

根据您的配置,您正在使用序列生成 ID (test_data_seq),而不使用休眠序列值缓存。当您手动设置 ID = 2000 时,不会更新序列的当前值。您需要手动更新它,例如通过使用 this function:

SELECT setval('test_data_seq', 2000);

在这种情况下,下一个生成的值应该是 2001。

总体而言,如果使用序列生成器,最好避免手动设置 id,因为发生冲突的风险很高。