Java 休眠序列乘以50生成“@Id”?
这将创建以下架构:Java 休眠序列乘以50生成“@Id”?,java,spring,hibernate,Java,Spring,Hibernate,这将创建以下架构: private static final String SEQUENCE = "my_seq"; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE) @SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE) private Long titId; 观察: 当我将序列的当前值设置为1时,则自动生成的第
private static final String SEQUENCE = "my_seq";
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE)
private Long titId;
观察:
当我将序列的当前值设置为1时,则自动生成的第一个@Id
为50
。当我将值设置为1000
时,第一个id是50000
因此,序列的当前值总是乘以50
。为什么?如何防止这种情况发生,而只使用序列中的nexval?此行为来自@SequenceGenerator
,它的参数allocationSize
的默认值为50。如果需要,可以对其进行更改:
CREATE SEQUENCE my_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1000
CACHE 1;
这是出于性能原因。它允许Hibernate预订一块id,并防止每次需要新id时询问数据库。我在Hibernate 5中也遇到了这个问题:
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 42)
private Long titId;
得到如下警告:
发现使用了不推荐的[org.hibernate.id.SequenceHiLoGenerator]
基于序列的id生成器;使用
改为org.hibernate.id.enhanced.SequenceStyleGenerator。看见
有关详细信息,请参阅《Hibernate域模型映射指南》
然后将我的代码更改为SequenceStyleGenerator
:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE)
private Long titId;
这解决了我的两个问题:
1) 已修复不推荐使用的警告
2) 现在根据oracle序列生成id。但是hibernate应该使用DB提供的值,比如如果hibernate预订了值1-50,那么它应该使用其中的一个。但是为什么它要乘以50呢?
@Id
@GenericGenerator(name="cmrSeq", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "SEQUENCE")}
)
@GeneratedValue(generator = "sequence_name")
private Long titId;