回答

收藏

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

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

我有几个AUTO与Hibernate和一起使用密钥生成策略的实体postgres。
/ o0 j/ `; h# h@Id2 t0 x( E  @+ Y6 z  B' S
@GeneratedValue(strategy=GenerationType.AUTO)' p2 ^/ u# `% ^* k% Q* v9 U
private Long id;
; m" {- S/ e/ _8 ~5 e这将导致hibernate_sequence生成一个,并且每个实体在分配键时都将使用该序列。# W, p' j- |" U2 Z7 v! C5 w& W( V
现在,我有一个包含大量缓存数据(如100k条目)的表和一些用户表。由于两者都使用策略AUTO,因此它们都从相同的休眠序列中获取密钥。结果,即使我只有10个用户,他们的ID也会全部由6到7位数字组成,例如123123。
6 w4 N4 @* |- _" K4 A" z我不知道一般而言是否应该为每个表引入自定义序列?还是我不应该那么在乎id的生成?
" q! S7 R" t, x. v8 T               
% R  |5 @% _( l  P( e解决方案:; e$ Y' V% V/ _1 ^6 s$ R' S
               
* S8 @$ c( ?4 F* k) b8 S5 A- S3 f7 n6 O1 H! @/ G/ @. x% y7 S- z) U8 R
' q) i) e- |- s4 \) T
                我最近为我的项目解决了这个问题。我使用增强型序列生成器(这是序列样式生成器的默认值),并将prefer_sequence_per_entity参数设置为true。: g' r4 T3 ]( Y( o; y
我的内容package-info.java:
! r6 Y% }3 W, F+ t" r, O$ |) N# a@GenericGenerator(9 [8 ~; Q; n0 R# J6 p
    name = "optimized-sequence",2 B, ^; ?1 W. K1 G# Y7 o% ~/ U
    strategy = "enhanced-sequence",  n& Z! |. A) C6 S
    parameters = {
/ _; ~3 A+ z* T' L' i% k        @Parameter(name="prefer_sequence_per_entity", value="true"),
/ s3 S9 \6 y8 m" r2 j3 k        @Parameter(name="optimizer", value="hilo"),5 |$ v( y) h/ P% z7 B  P' k
        @Parameter(name="increment_size", value="50")}), Y3 ]- o4 U* J; X' X; @  z
package org.example.model;; p2 b: y0 n0 D+ ?+ o: f8 |! b" ^
import org.hibernate.annotations.GenericGenerator;% D! u1 E6 b; F* K  Y) }! M& \
import org.hibernate.annotations.Parameter;; `* X" @7 ]6 _
在使用方面,您只需要
. t* q0 b2 j1 R& X. q. I- N6 O@Id @GeneratedValue(generator="optimized-sequence")9 {+ R  N$ N2 s( n
public long id;
1 G4 I3 }( Y! O$ }6 |我更喜欢使用单独的序列,因为偶尔我会放一个表并重新创建它,并且我希望ID从一个表开始。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则