【问题标题】:increment or sequence instead of table generation JPA增量或序列而不是表生成 JPA
【发布时间】:2013-03-02 05:55:09
【问题描述】:

我正在开发一个支持多个数据库的应用程序,并通过休眠来满足该要求。

现在问题在于主自动生成密钥。一些数据库支持自动增量和一些增加标识所需的序列。要解决此问题,请使用以下策略

strategy = GenerationType.TABLE (javax.persistence)

这满足了我的要求。

在这个post,一个用户评论说

如果您需要按顺序排列 id,最好使用增量或序列而不是表生成

如果我使用自动增量或序列,这意味着当我将一个数据库移动到另一个数据库时,它需要在注释级别进行一些更改(额外负担)

更新我,使用增量或序列而不是表生成真的更好,还是只是一个语句?

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: java hibernate jpa


【解决方案1】:

自动递增的缺点:在事务提交之前您不知道 id(这在 JPA 中可能是一个问题,因为某些 EntityManager 操作依赖于 Id)。并非所有数据库都支持自动递增字段。

序列缺点:并非所有数据库都有序列。

表格的缺点:ID 不一定是连续的。

由于您用完 Id 的可能性很小,因此使用表生成仍然是一个不错的选择。您甚至可以调整 id 分配大小以使用更多连续的 id(默认大小为 50):

@TableGenerator(name="myGenerator", allocationSize=1)

但是,对于每个插入,这将导致至少对 id 分配表进行两次查询:一次查询最新 id 的值,另一次检索它。

【讨论】:

  • 如果您使用的是序列(而不是 auto_increment),您可以在事务提交之前知道 ID - 甚至 之前插入。
  • 是的,还有表格生成。
  • 但是表生成(如果我正确理解这个概念的话)要慢得多,而且可扩展性也差得多。今天所有现代 DBMS 都支持序列
  • Mysql 没有序列
猜你喜欢
  • 2020-10-14
  • 2021-10-07
  • 1970-01-01
  • 2017-12-04
  • 2019-11-26
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多