【发布时间】:2011-09-15 15:57:09
【问题描述】:
实体在id列上有如下注解:
@Id
@SequenceGenerator(name = "JOB_MISFIRE_ID_GENERATOR", sequenceName="job_misfire_sequence", allocationSize=10)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "JOB_MISFIRE_ID_GENERATOR")
@Column(unique = true, nullable = false)
private Long id;
在数据库中,我有以下内容:
CREATE SEQUENCE job_misfire_sequence
INCREMENT 10
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
并且该序列用于获取列的默认值。
ALTER TABLE job_misfires
ALTER COLUMN id SET DEFAULT nextval('job_misfire_sequence');
当我使用 nextval('job_misfire_sequence') 手动手动插入数据库时,一切正常。当序列的当前值为 1 时,产生了以下 id 值:
SELECT nextval('job_misfire_sequence'); --> 1
SELECT nextval('job_misfire_sequence'); --> 11
SELECT nextval('job_misfire_sequence'); --> 21
SELECT nextval('job_misfire_sequence'); --> 31
但是当 hibernate 向这个表中插入一行时会发生什么,它会从这个序列中获取下一个值(在这个场景中是 41)并将它乘以 10 并将其用作 id 值。这意味着插入的行现在的 id 值为 410。
我做错了什么?这种情况将导致冲突,因为 hibernate 不使用序列提供的值。如果我理解正确的组合
分配大小=10
在注释和
增加 10
在序列中应该保证休眠只需要每隔十个值从序列中请求一个新值。为什么这没有发生?为什么序列中的值要乘以 10?
我正在使用
- PostgreSQL 9.0.3
- 休眠 3.5.5
- 休眠 JPA 2.0 api 1.0.0 最终版
更新 1:
正如互联网上的建议,在注释中将 allocationSize 值设置为 1 可以解决此问题。现在 id 值实际上是从 db 中的序列中获取的,我可以安全地在该表中手动插入行。
但是:
- allocationSize=1 会导致性能问题吗?
- 序列中的值不是在休眠状态下使用而是乘以 allocationSize 值,这不是一个巨大的错误吗?
- 该怪谁?休眠?
- 是否有可用的修复程序?
【问题讨论】:
-
在stackoverflow.com/questions/12745751/…找到合适的解决方案
标签: hibernate postgresql jpa-2.0 sequence