使用JPA 2序列生成的Postgresql中的怪异id值
|
该实体在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。
我究竟做错了什么?由于休眠状态未使用序列提供的值,因此这种情况将导致冲突。如果我了解正确性,
distributionSize = 10
在注释中
增加10
在序列中应该隔离,休眠只需要每十分之一的值从序列中请求一个新值。为什么这没有发生?为什么序列中的值乘以10?
我在用着
PostgreSQL 9.0.3
休眠3.5.5
Hibernate JPA 2.0 API 1.0.0最终版
更新1:
如互联网上所建议的那样,在批注中将allocationSize值设置为1可解决此问题。现在,id值实际上是从db中的序列中获取的,我可以安全地在该表中手动插入行。
但:
分配大小= 1是否会导致性能问题?
序列中的值不像冬眠中那样使用而是乘以allocationSize值,这不是一个巨大的错误吗?
谁该怪?冬眠?
有可用的修复程序吗?
没有找到相关结果
已邀请:
4 个回复
涸坍饺
在数据库中,我具有以下内容:
现在,当我使用nextval(\'job_misfire_sequence \')手动将其手动插入数据库时,一切都会按预期进行。当序列的当前值为1时,将生成以下id值:
现在,休眠也可以按我期望的方式工作。当我在一个会话中插入这4行之后插入一行时,返回给hibernate的序列值为11。Hibernate将其用作第一条记录的id值,将11用作下一条记录的ID值,依此类推。因为我在数据库中将CACHE设置设置为10,所以休眠现在只需要调用一次序列,然后可以使用10个连续的id值。我确认确实是这样,并且id值不重叠。 因此,关键点是: 您必须在注释中使用allocationSize = 1 如果要优化数据库插入的性能,请使用 在db中使用CACHE设置,其值大于1,但请勿触摸 获得良好的顺序ID值 您必须使用INCREMENT 1
郸身
,因为数据库已经返回正确的值。
蜗仓馈
献导外拘
的序列生成器时,Hibernate从序列中获得一个数字以生成
标识符。因此,在从序列中获得值
之后,它会生成从
到
的标识符。然后,它从序列中获取下一个值,以生成下一组标识符。如果下一个值是
,则生成的标识符是连续的,因此它期望产生序列号的序列号。 因此,无需在序列定义中指定“ 15”。