回答

收藏

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

技术问答 技术问答 360 人阅读 | 0 人回复 | 2023-09-14

我有几个AUTO与Hibernate和一起使用密钥生成策略的实体postgres。- c( {' h, z8 |! D6 _- J6 A$ _; E$ ^
@Id( @$ x8 e4 T7 }5 o  J8 J' X9 {0 d
@GeneratedValue(strategy=GenerationType.AUTO)
9 r9 E/ h6 ~4 d/ T8 M" u# ]private Long id;
. b$ `! B/ b7 O# l2 s这将导致hibernate_sequence生成一个,并且每个实体在分配键时都将使用该序列。# S, u3 j7 V9 e6 d
现在,我有一个包含大量缓存数据(如100k条目)的表和一些用户表。由于两者都使用策略AUTO,因此它们都从相同的休眠序列中获取密钥。结果,即使我只有10个用户,他们的ID也会全部由6到7位数字组成,例如123123。9 X& c! p9 n% \
我不知道一般而言是否应该为每个表引入自定义序列?还是我不应该那么在乎id的生成?
) S3 ?# l! Z/ X. A5 N# d3 R               
# G! b8 U, b. s- X+ w# N解决方案:
: a# A  h3 |, m1 ~7 C               
5 F  x! X$ V' p$ G# K9 W$ ^0 b! O' {" [8 T, B1 n+ j% e- n1 v

5 a4 x, K: T% [                我最近为我的项目解决了这个问题。我使用增强型序列生成器(这是序列样式生成器的默认值),并将prefer_sequence_per_entity参数设置为true。
  q$ V4 e2 }# m5 Q我的内容package-info.java:
7 I: x: }- f  {6 d# J" ~@GenericGenerator(
6 c( V9 h4 c/ E' L4 B    name = "optimized-sequence",  @. L# U4 u  {+ r* r
    strategy = "enhanced-sequence",5 G1 k! _; r8 e: I2 l9 q: g6 t
    parameters = {
: ^  e# M9 m% W8 a! r# D        @Parameter(name="prefer_sequence_per_entity", value="true"),0 b1 X2 R0 e1 w. y
        @Parameter(name="optimizer", value="hilo"),& S6 p# \: d' y( y1 C
        @Parameter(name="increment_size", value="50")})
1 E6 j! T2 u7 V# \( f# E7 dpackage org.example.model;
( ]- P& }8 r$ I7 dimport org.hibernate.annotations.GenericGenerator;
9 G$ I* L" R# X& t" w/ Z$ himport org.hibernate.annotations.Parameter;
- d# Q% P/ o0 }) d( o' |& k2 A在使用方面,您只需要3 V4 r" y& ~! t: N5 s7 ~
@Id @GeneratedValue(generator="optimized-sequence")3 ?7 Y5 W  I8 N( R
public long id;" e3 O" Y# Y, A* Z" T: n9 h
我更喜欢使用单独的序列,因为偶尔我会放一个表并重新创建它,并且我希望ID从一个表开始。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则