为了账号安全,请及时绑定邮箱和手机立即绑定

休眠,@ SequenceGenerator和allocationSize

休眠,@ SequenceGenerator和allocationSize

潇潇雨雨 2019-10-16 11:17:35
我们都知道使用Hibernate时的默认行为@SequenceGenerator-它使实际数据库序列增加一,将该值乘以50(默认allocationSize值)-然后将该值用作实体ID。这是错误的行为,并与说明以下内容的规范冲突:distributionSize-(可选)从序列中分配序列号时要增加的数量。需要明确的是:我不关心生成的ID之间的差距。我关心与基础数据库序列不一致的 ID 。例如:任何其他应用程序(例如,使用纯JDBC)可能要在从序列获得的ID下插入新行-但所有这些值可能已被Hibernate使用!疯狂。有人知道任何解决此问题的方法(没有设置allocationSize=1,从而降低性能)吗?编辑:弄清楚。如果最后插入的记录的ID = 1,则HB同时51, 52, 53...在其新实体BUT中使用值:数据库中序列的值将设置为2。当其他应用程序使用该序列时,很容易导致错误。 另一方面:规范(据我所知)说数据库序列应该设置为51,同时HB应该使用范围内的值  2, 3 ... 50更新: 正如下面的史蒂夫·埃伯索尔(Steve Ebersole)所述:通过设置可以启用我描述的行为(也是许多人中最直观的行为)hibernate.id.new_generator_mappings=true。谢谢大家。更新2:对于将来的读者,您可以在下面找到一个有效的示例。@Entity@Table(name = "users")public class User {    @Id    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")    @SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")    private Long id;}persistence.xml<persistence-unit name="testPU">  <properties>    <property name="hibernate.id.new_generator_mappings" value="true" />  </properties></persistence-unit>
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

绝对清楚...您所描述的内容与规范没有任何冲突。该规范讨论的是Hibernate分配给您的实体的值,而不是实际存储在数据库序列中的值。


但是,可以选择要获取的行为。首先看到我的答复:是否有一种方法可以使用JPA批注和Hibernate动态选择@GeneratedValue策略? 这将为您提供基础知识。只要您设置为使用该SequenceStyleGenerator,Hibernate就会使用SequenceStyleGenerator中allocationSize的“池优化器”进行解释。“池优化器”用于允许在创建序列时使用“增量”选项的数据库(并非所有支持序列的数据库都支持增量)。无论如何,请阅读那里的各种优化器策略。


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 1220 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信