我们都知道Hibernate在使用时的默认行为@SequenceGenerator- 它将实际数据库序列增加1,将此值乘以50(默认allocationSize值) - 然后将此值用作实体ID.
这是不正确的行为,并与规范冲突说:
allocationSize - (可选)从序列中分配序列号时的增量.
要明确:我不打算生成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;
}
Run Code Online (Sandbox Code Playgroud)
persistence.xml中
<persistence-unit name="testPU"> …Run Code Online (Sandbox Code Playgroud) 我已经配置了hibernate来使用oracle序列.使用cache = 20,increment = 1创建序列.
一切正常,hibernate持久化实体.id值很奇怪:50,51 .... 76,201,202 ... 209,1008,1009,5129,5130 ....
如果我要求序列值(从双重中选择hibernate_sequence.nextval),我得到的值就像2,3,4 ....
如果我打开hibernate sql debug,有时间调用"从双重选择hibernate_sequence.nextval",但是由hibernate分配给ID的号码不会按顺序中继!
@Id
@Column(name = "ID", insertable = false, updatable = false)
@SequenceGenerator(name = "SequenceIdGenerator", sequenceName = "HIBERNATE_SEQUENCE")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceIdGenerator")
private Long id;
Run Code Online (Sandbox Code Playgroud)