一尘不染

休眠模式应该为每个表使用唯一序列吗?

hibernate

我有几个实体AUTOHibernate和中使用密钥生成策略postgres

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

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

现在,我有一个包含大量缓存数据(如100k条目)的表和一些用户表。由于两者都使用策略AUTO,因此它们都从相同的hibernate序列中获取密钥。结果,即使我只有10个用户,他们的ID也会全部由6到7位数字组成,例如123123

我不知道一般而言是否应该为每个表引入自定义序列?还是我不应该那么在乎id的生成?


阅读 242

收藏
2020-06-20

共1个答案

一尘不染

我最近为我的项目解决了这个问题。我使用增强型序列生成器(这是序列样式生成器的默认值),并将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从一个表开始。

2020-06-20