我们都知道 Hibernate 在使用时的默认行为@SequenceGenerator
——它将真实数据库序列增加一,将此值乘以 50(默认allocationSize
值)——然后将此值用作实体 ID。
这是不正确的行为,并且与说明的规范冲突:
allocationSize - (可选)从序列中分配序列号时增加的数量。
需要明确的是:我不关心生成的 ID 之间的差距。
我关心与底层数据库序列不一致的 ID。例如:任何其他应用程序(例如使用普通 JDBC)可能希望在从序列获得的 ID 下插入新行 - 但所有这些值可能已经被 Hibernate 使用!疯狂。
有人知道这个问题的任何解决方案(没有设置allocationSize=1
并因此降低性能)吗?
编辑:
说清楚。如果最后插入的记录 ID = 1
,则 HB51, 52, 53...
同时使用其新实体的值:数据库中的序列值将设置为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;
}
持久性.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>