我有几个实体使用AUTO密钥生成策略与Hibernate和postgres。
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;这将导致生成一个hibernate_sequence,每个实体在分配密钥时都将使用该序列。
现在,我有了一个具有大量缓存数据(比如100 k条目)的表和一些用户表。由于都使用策略AUTO,它们都从相同的hibernate序列中获取密钥。因此,即使我只有10个用户,他们都有一个6-7位长的id,就像123123一样。
我想知道,一般来说,是否应该为每个表引入一个自定义序列?或者我不应该那么关心身份一代?
发布于 2014-04-11 08:20:56
我最近为我的项目解决了这个问题。我使用增强序列生成器(这是序列样式生成器的缺省值),并将prefer_sequence_per_entity参数设置为true。
我的package-info.java的内容
@GenericGenerator(
name = "optimized-sequence",
strategy = "enhanced-sequence",
parameters = {
@Parameter(name="prefer_sequence_per_entity", value="true"),
@Parameter(name="optimizer", value="hilo"),
@Parameter(name="increment_size", value="50")})
package org.example.model;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;在使用方面,你只需要
@Id @GeneratedValue(generator="optimized-sequence")
public long id;我更喜欢有单独的序列,因为偶尔我会删除一个表并重新创建它,我希望ID从一个开始。
发布于 2014-04-11 07:41:27
您可以为useid使用串行数据类型,也可以使用PostgreSQL序列。比如:
digoal=# create table tt(id serial, info text);
CREATE TABLE
digoal=# insert into tt (info) values ('test'),('test');
INSERT 0 2
digoal=# select * from tt;
id | info
----+------
1 | test
2 | test
(2 rows)或
digoal=# create table tt1(id int, info text);
CREATE TABLE
digoal=# create sequence seq_tt1;
CREATE SEQUENCE
digoal=# alter table tt1 alter column id set default nextval('seq_tt1'::regclass);
ALTER TABLE
digoal=# insert into tt1 (info) values ('test'),('test');
INSERT 0 2
digoal=# select * from tt1;
id | info
----+------
1 | test
2 | test
(2 rows)发布于 2014-04-11 08:04:48
尝试与序列
postgres中的第一个创建序列
CREATE SEQUENCE YOUR_ENTITY_SEQ;在实体中,使用生成策略作为SEQUENCE,并在下一次使用gen值分配设置必要的allocationSize。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "YOUR_ENTITY_SEQ")
@SequenceGenerator(name = "YOUR_ENTITY_SEQ", sequenceName = "YOUR_ENTITY_SEQ", allocationSize = 1)
private Long id;https://stackoverflow.com/questions/23006172
复制相似问题