回答

收藏

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

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

我有几个AUTO与Hibernate和一起使用密钥生成策略的实体postgres。
6 k2 b; N) q7 [. p$ ], o0 g) \: t) v@Id8 u# B( w* X- K( h6 x
@GeneratedValue(strategy=GenerationType.AUTO)8 ^4 R+ D+ t9 b, @
private Long id;
8 T# W% h9 [; m* o9 }这将导致hibernate_sequence生成一个,并且每个实体在分配键时都将使用该序列。
: S, K6 x* w) ^# y  n! b现在,我有一个包含大量缓存数据(如100k条目)的表和一些用户表。由于两者都使用策略AUTO,因此它们都从相同的休眠序列中获取密钥。结果,即使我只有10个用户,他们的ID也会全部由6到7位数字组成,例如123123。, L, ]% M3 z6 ^
我不知道一般而言是否应该为每个表引入自定义序列?还是我不应该那么在乎id的生成?  j1 t7 V4 e3 o( X; o
                1 f( p  x: t$ q& h
解决方案:. F+ l0 N5 e$ H+ [& ]" _
                2 @( |5 J; D( H! K) w% `7 v

9 i! l1 b" A+ ]/ U% k9 x- C
6 f" M' t, i2 b- v0 \4 U2 ^9 k                我最近为我的项目解决了这个问题。我使用增强型序列生成器(这是序列样式生成器的默认值),并将prefer_sequence_per_entity参数设置为true。. z1 Y5 W8 q/ t7 m$ Y) H
我的内容package-info.java:/ J) \. V9 C- B' \; z5 W' Y, I4 M- I
@GenericGenerator(
6 F5 v- o# R) r5 n/ O* o6 c    name = "optimized-sequence",$ q+ Z; E4 ?9 s
    strategy = "enhanced-sequence",
1 y* W6 w# I4 R4 S    parameters = {. k+ H, B! Q* L1 u
        @Parameter(name="prefer_sequence_per_entity", value="true"),6 d( s" \8 x! S8 N
        @Parameter(name="optimizer", value="hilo"),. m3 s. i# _" T6 D0 L3 ~8 I' e: l
        @Parameter(name="increment_size", value="50")})
. T+ {& d  u% \package org.example.model;
; i+ `8 A) ?9 v; U% }  O7 }7 R$ Kimport org.hibernate.annotations.GenericGenerator;- B! A8 m& \$ Y. x/ ^% q0 }8 }! ]: I
import org.hibernate.annotations.Parameter;0 }2 a0 k2 n2 o
在使用方面,您只需要$ u; `) }+ V% W3 a
@Id @GeneratedValue(generator="optimized-sequence")
+ E5 V: e5 Y( e/ Gpublic long id;
4 ?6 b2 C' f. k4 X5 `# s4 J, T我更喜欢使用单独的序列,因为偶尔我会放一个表并重新创建它,并且我希望ID从一个表开始。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则