@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没有使用序列提供的值。如果我理解正确,则注释中的allocationSize = 10和序列中的INCREMENT 10的组合应确保Hibernate只需要每十个值向序列请求一个新值。为什么不会发生这种情况?为什么要将序列中的值乘以10?
我正在使用:
- Postgresql 9.0.3
- Hibernate 3.5.5
- Hibernate JPA 2.0 api 1.0.0 final
更新1:
正如互联网上建议的那样,在注释中将allocationSize值设置为1可以解决此问题。现在,id值确实是从数据库中的序列中获取的,我可以安全地在该表中手动插入行。
但是:
- allocationSize=1会导致性能问题吗?
- 序列中的值不被Hibernate直接使用而是乘以allocationSize值,这不是一个巨大的bug吗?
- 谁应该为此负责?Hibernate?
- 是否有可用的修复程序?