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

时间:2011-04-15 12:21:24

标签: java sql database hibernate jpa

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

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

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

4 个答案:

答案 0 :(得分:5)

我认为有几个原因:

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

答案 1 :(得分:3)

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

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

  

[...]如果申请不关心什么   这种生成被使用了   提供者,但希望生成   发生时,它可以指定策略   AUTO。

     

使用AUTO有一个问题,   虽然。提供商可以选择它   自己的策略来存储标识符,   但它需要某种形式   持久性资源才能这样做。   例如,如果它选择了   基于表的策略,它需要   创建一个表;如果它选择了   基于序列的策略,它需要   创建一个序列。提供者不能   总是依赖于数据库连接   它从服务器获取到   有权创建一个表   数据库。这通常是一个   经常享有特权的经营权   仅限于DBA。需要   成为某种创造阶段或   模式生成导致   在AUTO之前创建的资源   战略能够发挥作用。

     

AUTO模式真的是一代人   发展战略或   原型。它作为一种手段很好   让你起来跑步更多   在数据库模式时快速   正在生成。在任何其他   情况,最好使用   其他一代战略之一   在后面的章节中讨论了[...]

答案 2 :(得分:1)

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

答案 3 :(得分:1)


选择身份生成器有不同的考虑因素,最重要的是性能和可移植性,但也可能需要考虑群集和数据迁移。

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

您可以在我的博客上阅读有关身份生成策略的相关详细信息:here

的Eyal