我们都知道 Hibernate 在使用 @SequenceGenerator
时的默认行为-它将实际数据库序列增加 一,将该值乘以50(默认 allocationSize
值)-然后使用该值作为实体 ID。
这是不正确的行为,与 规格的说法相冲突:
AllocationSize-(可选)在从序列分配序列号时增加的数量。
需要说明的是: 我不关心生成的 ID 之间的间隔。
我关心的 ID 是具有底层数据库序列的 不一致。例如: 任何其他应用程序(例如使用普通 JDBC)可能希望在从序列获得的 ID 下插入新行-但是所有这些值可能已经被 Hibernate 使用了!疯狂。
有人知道这个问题的解决方案吗(不设置 allocationSize=1
,从而降低性能) ?
编辑:
把事情说清楚。
如果上次插入的记录 ID = 1
,那么 HB 同时为其新实体使用值 51, 52, 53...
,但是: 数据库中序列的值将被设置为 2
。当其他应用程序使用该序列时,这很容易导致错误。< br/>
另一方面: 规范说(在我的理解中)数据库序列应该被设置为 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;
}
Xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>