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)
序列生成器是一致的。它唯一的任务是生成唯一的整数值,没有其他任务。为什么你会对这种行为感到困扰?
如前所述,此行为是由 oracle 缓存、预分配、序列号(默认情况下为 20)引起的。ID 列是代理/人工主键,仅用于唯一标识行,不应从中派生任何信息。即使您不缓存序列号,由于事务回滚、删除、应用程序和数据库服务器重新启动,您也永远不会获得不间断的 ID 系列。并且不缓存序列会对大容量事务系统造成严重的性能损失。
所以忽略它吧,没关系,没有什么问题。不存在无间隙序列生成器这样的东西......
| 归档时间: |
|
| 查看次数: |
2832 次 |
| 最近记录: |