我已将 Hibernate 配置为使用 PostgreSQL 序列(通过注释)来生成主键值id栏目如下:
@Id
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
return this.id;
}
我通过此配置看到的是 hibernate 已经在分配id持久化时值 > 3000,而对已使用序列的查询显示以下内容:
database=# select last_value from entity_id_seq;
last_value
------------
69
(1 row)
问题:
有没有什么不对的地方?
hibernate 应该与序列表同步吗?
如果不是,那么最后生成的 id 存储在哪里?
谢谢。
我有同样的问题。和Hibernate的id分配策略有关。当你选择GenerationType.SEQUENCE,Hibernate 使用 HiLo 策略,默认以 50 个块为单位分配 ID。所以你可以明确设置分配大小像这样的值:
@Id
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
return this.id;
}
不过,我也听到过使用 HiLo 策略的意见分配大小=1这不是一个好的做法。有些人建议使用生成类型.AUTO相反,当您必须处理数据库管理的序列时
Update:我最终选择了allocationSize=1,现在事情似乎按我的预期进行。我的应用程序实际上并不需要 ID 块,所以YMMV http://en.wiktionary.org/wiki/YMMV.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)