0

我一直在浏览 JPA 文档,并在分配序列 id 时遇到了预分配的事情。

尽管出于明显的性能原因它非常好。但我正在考虑它可能会搞砸事情的场景。

据我了解,当我们在使用表排序或排序对象作为生成序列的策略时设置分配大小 = 100 时,像 hibernate 或 Eclipse 链接这样的持久性提供程序将维护内存计数器,插入记录的应用程序代码不必进入数据库对于每个插入。

当该内存计数器达到 100 时,数据库序列增加 100 并继续相同的故事。到目前为止一切都很好。

但是假设我们在生产中遇到了一个错误,我们发现某些表中的记录没有被插入到数据库中。

所以我们准备脚本在数据库中插入这些记录,现在我们为表的主键赋予什么值。如果我们从数据库中获取值,当应用程序尝试插入记录时很有可能会发生冲突使用内存计数器并会给出 SQL 异常。

有人遇到过这样的问题吗?处理这种情况的最佳方法是什么?

4

1 回答 1

1

只需确保在脚本中使用与 Hibernate 生成器相同的策略即可。例如,如果序列位于 2300,并且 Hibernate 生成器将序列增加 100 并生成 ID 2301 到 2400 而不转到序列,请在脚本中执行相同操作。

或者停止应用程序,运行您的脚本,并使用一个值重新生成序列,以保证 Hibernate 生成器不会生成已使用的 ID。

于 2012-09-25T11:07:34.277 回答