为什么大多数hibernate应用程序都使用序列进行id生成?
为什么不在@GeneratedValue注释中使用默认的GenerationType = AUTO?
P.S。在我的职业生涯中,我看到每个人都是使用序列,但我不明白为什么他们更难以部署解决方案(在部署指令中始终有序列创建SQL命令)。
答案 0 :(得分:5)
我认为有几个原因:
答案 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