java – hibernate应该为每个表使用唯一的序列吗?

我有几个实体使用自动密钥生成策略与Hibernate和postgres.

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

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

现在我有一个包含大量缓存数据(如100k条目)和一些用户表的表.由于两者都使用策略AUTO,因此它们都从相同的休眠序列中获取密钥.结果,即使我只有10个用户,他们都将拥有6-7位长的id,如123123.

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

解决方法

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...