首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate应该对每个表使用唯一的序列吗?

hibernate应该对每个表使用唯一的序列吗?
EN

Stack Overflow用户
提问于 2014-04-11 07:27:53
回答 4查看 7K关注 0票数 6

我有几个实体使用AUTO密钥生成策略与Hibernatepostgres

代码语言:javascript
复制
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

这将导致生成一个hibernate_sequence,每个实体在分配密钥时都将使用该序列。

现在,我有了一个具有大量缓存数据(比如100 k条目)的表和一些用户表。由于都使用策略AUTO,它们都从相同的hibernate序列中获取密钥。因此,即使我只有10个用户,他们都有一个6-7位长的id,就像123123一样。

我想知道,一般来说,是否应该为每个表引入一个自定义序列?或者我不应该那么关心身份一代?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-11 08:20:56

我最近为我的项目解决了这个问题。我使用增强序列生成器(这是序列样式生成器的缺省值),并将prefer_sequence_per_entity参数设置为true

我的package-info.java的内容

代码语言:javascript
复制
@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;

在使用方面,你只需要

代码语言:javascript
复制
@Id @GeneratedValue(generator="optimized-sequence")
public long id;

我更喜欢有单独的序列,因为偶尔我会删除一个表并重新创建它,我希望ID从一个开始。

票数 17
EN

Stack Overflow用户

发布于 2014-04-11 07:41:27

您可以为useid使用串行数据类型,也可以使用PostgreSQL序列。比如:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2014-04-11 08:04:48

尝试与序列

postgres中的第一个创建序列

代码语言:javascript
复制
CREATE SEQUENCE YOUR_ENTITY_SEQ;

在实体中,使用生成策略作为SEQUENCE,并在下一次使用gen值分配设置必要的allocationSize

代码语言:javascript
复制
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "YOUR_ENTITY_SEQ")
@SequenceGenerator(name = "YOUR_ENTITY_SEQ", sequenceName = "YOUR_ENTITY_SEQ", allocationSize = 1)
private Long id;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23006172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档