为什么大多数hibernate应用程序正在使用序列进行id生成?为什么大多数hibernate应用程序使用序列进行id生成?
为什么不在@GeneratedValue注释中使用默认的GenerationType = AUTO?
P.S.在我的职业生涯中,我看到每个人都在使用序列,但我不明白他们为何难以部署解决方案(在部署说明中总是有序列创建SQL命令)。
为什么大多数hibernate应用程序正在使用序列进行id生成?为什么大多数hibernate应用程序使用序列进行id生成?
为什么不在@GeneratedValue注释中使用默认的GenerationType = AUTO?
P.S.在我的职业生涯中,我看到每个人都在使用序列,但我不明白他们为何难以部署解决方案(在部署说明中总是有序列创建SQL命令)。
我看到几个原因:
至少对于Oracle来说:一个原因是能够跟踪表中对象的数量(如果没有对象从表中删除,那么特定于表格的序列是很好的)。使用GenerationType = AUTO时会使用全局序列号,当数据库中有多个表时,会导致ID号中的空格。
有趣的观察,我会检查出 – IAdapter 2011-04-16 06:21:02
我使用GenerationType = AUTO,我注意到连续行之间的id的差距 – 2012-01-05 14:43:59
来自Mike Keith和Merrick Schincario的优秀书Pro JPA 2 Mastering Java Persistence API。
从第4章:对象关系映射,标识符生成一节。
[...]如果一个应用程序不关心什么样 一代所使用的 供应商,而是希望一代 发生,它可以指定 AUTO的战略。
虽然有一个使用自动, 的渔获。供应商可以选择自己的策略来存储标识符 ,但它需要持有某种类型的持久性资源才能这样做。例如,如果它选择一个基于表格的策略 ,则需要创建一个表格 ;如果选择基于序列的策略 ,则需要 创建一个序列。提供者不能 总是依赖于它从服务器获得的数据库连接 到 有权限在 数据库中创建表。这通常是 特权操作,通常是受限于DBA的 。将需要 作为某种创建阶段或 架构生成,以便在AUTO 策略能够运行之前创建资源 。
AUTO模式实际上是一代 开发策略或 原型。当数据库模式为 被生成时,它可以很好地帮助您快速启动并运行更多 。在任何其他情况 ,这将是更好地使用在后面的章节讨论的其他代战略 的 一个[...]
有可供选择的身份产生不同的考虑,最重要的是性能和便携性也是集群和数据迁移可能是一个考虑因素。
实际上,在最新的Hibernate版本(如果不是全部),SEQUENCE策略实际上是一个基于序列的HiLo,而不是像人们假设的纯序列。
可以读取一个漂亮的细节就张贴在我的博客身份生成策略:here
的Eyal
什么数据库[S]你的目标? Auto对于MySQL用户来说很常见,但对于Oracle或MS来说不是。不幸的是,所有的生成策略都有优点和缺点,这就是为什么它们有这么多。 – 2011-04-15 14:36:59
@甲骨文。我认为这背后肯定有一些原因。 – IAdapter 2011-04-16 06:17:37