2011-04-15 30 views
4

为什么大多数hibernate应用程序正在使用序列进行id生成?为什么大多数hibernate应用程序使用序列进行id生成?

为什么不在@GeneratedValue注释中使用默认的GenerationType = AUTO?

P.S.在我的职业生涯中,我看到每个人都在使用序列,但我不明白他们为何难以部署解决方案(在部署说明中总是有序列创建SQL命令)。

+0

什么数据库[S]你的目标? Auto对于MySQL用户来说很常见,但对于Oracle或MS来说不是。不幸的是,所有的生成策略都有优点和缺点,这就是为什么它们有这么多。 – 2011-04-15 14:36:59

+0

@甲骨文。我认为这背后肯定有一些原因。 – IAdapter 2011-04-16 06:17:37

回答

3

我看到几个原因:

  1. 最常用的企业应用程序中的数据库可能是Oracle,Oracle不具有自动生成的ID,但是具有序列。
  2. 序列允许在插入新行之前拥有该ID,而不是在插入新行之后。这更容易使用,效率更高,因为您可以在事务结束时批量插入语句,但在事务处理过程中仍然拥有定义的ID。
  3. 序列允许使用hilo算法(这是hibernate序列生成的缺省算法),因此只需对多个插入进行一次数据库调用,从而提高性能。
  4. AUTO在数据库之间有所不同,而序列总是使用相同的策略。
1

至少对于Oracle来说:一个原因是能够跟踪表中对象的数量(如果没有对象从表中删除,那么特定于表格的序列是很好的)。使用GenerationType = AUTO时会使用全局序列号,当数据库中有多个表时,会导致ID号中的空格。

+0

有趣的观察,我会检查出 – IAdapter 2011-04-16 06:21:02

+0

我使用GenerationType = AUTO,我注意到连续行之间的id的差距 – 2012-01-05 14:43:59

3

来自Mike Keith和Merrick Schincario的优秀书Pro JPA 2 Mastering Java Persistence API

从第4章:对象关系映射,标识符生成一节。

[...]如果一个应用程序不关心什么样 一代所使用的 供应商,而是希望一代 发生,它可以指定 AUTO的战略。

虽然有一个使用自动, 的渔获。供应商可以选择自己的策略来存储标识符 ,但它需要持有某种类型的持久性资源才能这样做。例如,如果它选择一个基于表格的策略 ,则需要创建一个表格 ;如果选择基于序列的策略 ,则需要 创建一个序列。提供者不能 总是依赖于它从服务器获得的数据库连接 到 有权限在 数据库中创建表。这通常是 特权操作,通常是受限于DBA的 。将需要 作为某种创建阶段或 架构生成,以便在AUTO 策略能够运行之前创建资源 。

AUTO模式实际上是一代 开发策略或 原型。当数据库模式为 被生成时,它可以很好地帮助您快速启动并运行更多 。在任何其他情况 ,这将是更好地使用在后面的章节讨论的其他代战略 的 一个[...]

1


有可供选择的身份产生不同的考虑,最重要的是性能和便携性也是集群和数据迁移可能是一个考虑因素。

实际上,在最新的Hibernate版本(如果不是全部),SEQUENCE策略实际上是一个基于序列的HiLo,而不是像人们假设的纯序列。

可以读取一个漂亮的细节就张贴在我的博客身份生成策略:here

的Eyal

相关问题