休眠、@SequenceGenerator和分配大小
我们都知道Hibernate在使用时的默认行为 - 它将实际数据库序列增加一,将此值乘以50(默认值) - 然后使用此值作为实体ID。@SequenceGenerator
allocationSize
这是不正确的行为,并且与规范相冲突,该规范说:
allocationSize - (可选)从序列分配序列号时要递增的量。
需要明确的是:我不关心生成的ID之间的差距。
我关心的是与基础数据库序列不一致的 ID。例如:任何其他应用程序(例如,使用纯JDBC)可能希望在从序列获得的ID下插入新行 - 但所有这些值可能已经被Hibernate使用!疯狂。
是否有人知道此问题的任何解决方案(无需设置,从而降低性能)?allocationSize=1
编辑:
让事情变得清晰。如果上次插入的记录 ID = ,则 HB 同时为其新实体使用值,但同时:序列在数据库中的值将设置为 。当其他应用程序使用该序列时,这很容易导致错误。1
51, 52, 53...
2
在另外一方面:规范说(在我的理解中)数据库序列应该设置为,同时HB应该使用范围中的值。51
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>