Hibernate 序列生成器不一致

abh*_*123 5 oracle hibernate hilo sequence-generators jpa-annotations

我有一个表,其促销 ID 注释为

@SequenceGenerator(name="GEN_PROMID", sequenceName="SEQ_PROMOTIONID", allocationSize=1)
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="GEN_PROMID")
@Column(name="PROMOTIONID")
private Long promotionid;
Run Code Online (Sandbox Code Playgroud)

但即使allocationSize 被指定为1,hibernate 也会不一致地增加数字。以下是数据库中 Promotionid 的最新降序值

1440
1420
1407
1406
1405
1404
1403
1402
1401
1400
1380
1360
1342
1341
1340
1320
1305
Run Code Online (Sandbox Code Playgroud)

我在某处读到 Hibernate 可能会使用 hilo seq_hilo algotihm 和org.hibernate.id.SequenceHiLoGenerator生成器,即使@SequenceGenerator已定义。另请阅读以下链接,我们可以使用它@GenericGenerator来解决链接中的此问题

有人可以在这方面提供详细信息吗?语法@GenericGenerator看起来并不简单。该@SequenceGenerator用还是不用。有时@SequenceGenerator可以完美地工作并生成正确的主键。

附言。我正在使用 Hibernate 3.5 并使用 Oracle 11g DB

编辑

序列码-

CREATE SEQUENCE SEQ_PROMOTIONID
    INCREMENT BY 1
    START WITH 100;
Run Code Online (Sandbox Code Playgroud)

编辑2

更多分析表明,至少“总是”插入一个可被 20 整除的值。由于Oracle的序列默认缓存为20,因此看起来hibernate的正常增量与缓存值之间存在一些冲突。还观察到,当插入之间有时间间隙时,它通常会转到下一个可被 20 整除的值,否则会适当增加到 1

1440    12-NOV-14 09.33.09.686000000 AM
1420    07-NOV-14 07.21.41.238000000 AM
1407    03-NOV-14 11.40.41.508000000 AM
1406    03-NOV-14 11.31.37.341000000 AM
1405    03-NOV-14 04.57.53.356000000 AM
1404    03-NOV-14 04.56.39.074000000 AM
1403    03-NOV-14 04.55.17.741000000 AM
1402    03-NOV-14 04.30.59.980000000 AM
1401    03-NOV-14 04.27.14.016000000 AM
1400    03-NOV-14 04.19.23.736000000 AM
1380    27-OCT-14 11.06.33.360000000 AM
1360    17-OCT-14 11.59.15.738000000 AM
1342    15-OCT-14 01.57.50.253000000 PM
1341    15-OCT-14 01.55.39.173000000 PM
1340    14-OCT-14 07.07.14.283000000 AM
1320    10-OCT-14 10.41.04.766000000 AM
1305    07-OCT-14 11.08.10.388000000 AM
1304    07-OCT-14 05.00.50.295000000 AM
1303    07-OCT-14 04.59.01.434000000 AM
1302    06-OCT-14 11.34.43.012000000 AM
1301    06-OCT-14 11.31.18.855000000 AM
1300    06-OCT-14 11.27.16.237000000 AM
1280    04-OCT-14 04.47.40.391000000 AM
1261    01-OCT-14 05.09.06.291000000 PM
1260    01-OCT-14 10.18.41.060000000 AM
1241    22-SEP-14 07.04.45.593000000 AM
1240    22-SEP-14 04.57.25.289000000 AM
1220    19-SEP-14 06.55.31.450000000 AM
1200    16-SEP-14 09.03.04.763000000 AM
1181    10-SEP-14 07.44.04.115000000 AM
1180    08-SEP-14 11.05.30.590000000 AM
1168    04-SEP-14 05.09.46.000000000 AM
1167    02-SEP-14 07.47.52.454000000 AM
1166    02-SEP-14 07.46.52.043000000 AM
1165    02-SEP-14 07.45.38.323000000 AM
1164    02-SEP-14 07.43.27.562000000 AM
1163    02-SEP-14 07.41.11.702000000 AM
1162    02-SEP-14 07.39.27.336000000 AM
1161    02-SEP-14 07.37.35.561000000 AM
1160    02-SEP-14 07.36.12.776000000 AM
1140    28-AUG-14 06.09.08.346000000 AM
1122    25-AUG-14 09.15.51.112000000 AM
1121    25-AUG-14 09.14.30.789000000 AM
1120    25-AUG-14 09.12.54.710000000 AM
1100    20-AUG-14 05.46.08.394000000 AM
1080    14-AUG-14 10.44.54.917000000 AM
1061    09-AUG-14 06.00.43.708000000 AM
1060    07-AUG-14 02.12.24.893000000 PM
1042    04-AUG-14 07.34.57.224000000 AM
1041    04-AUG-14 07.32.16.555000000 AM
1040    04-AUG-14 07.28.34.526000000 AM
1021    01-AUG-14 11.45.22.141000000 AM
1020    31-JUL-14 09.46.17.765000000 AM
1002    23-JUL-14 01.33.45.940000000 AM
1001    22-JUL-14 11.07.54.784000000 AM
1000    21-JUL-14 06.50.43.991000000 AM
Run Code Online (Sandbox Code Playgroud)

Rob*_*ebe 3

序列生成器一致的。它唯一的任务是生成唯一的整数值,没有其他任务。为什么你会对这种行为感到困扰?

如前所述,此行为是由 oracle 缓存、预分配、序列号(默认情况下为 20)引起的。ID 列是代理/人工主键,仅用于唯一标识行,不应从中派生任何信息。即使您不缓存序列号,由于事务回滚、删除、应用程序和数据库服务器重新启动,您也永远不会获得不间断的 ID 系列。并且不缓存序列会对大容量事务系统造成严重的性能损失。

所以忽略它吧,没关系,没有什么问题。不存在无间隙序列生成器这样的东西......