回答

收藏

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

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

我有几个AUTO与Hibernate和一起使用密钥生成策略的实体postgres。- l& g8 V/ R0 L7 e( ~# b# R
@Id
, {6 j+ _% ^* [- K* e& `@GeneratedValue(strategy=GenerationType.AUTO)
# {# Z( H8 m* I4 \6 g! ^3 nprivate Long id;0 |5 t) g0 O  k- j  n
这将导致hibernate_sequence生成一个,并且每个实体在分配键时都将使用该序列。
+ n7 A* r# D1 a. a现在,我有一个包含大量缓存数据(如100k条目)的表和一些用户表。由于两者都使用策略AUTO,因此它们都从相同的休眠序列中获取密钥。结果,即使我只有10个用户,他们的ID也会全部由6到7位数字组成,例如123123。
" L+ n2 I+ e# y6 }4 m. K4 ?) m/ U我不知道一般而言是否应该为每个表引入自定义序列?还是我不应该那么在乎id的生成?
, o0 P' p% u6 j               
) m0 r4 A1 m  J) Z1 i% B  f解决方案:; b% w# ^$ C5 d, e0 s
               
/ u6 ~+ P% w5 x5 X% v% ^6 H+ Q. ^3 y9 h" ?
. F" b9 ^$ Z1 ]  x. R0 y
                我最近为我的项目解决了这个问题。我使用增强型序列生成器(这是序列样式生成器的默认值),并将prefer_sequence_per_entity参数设置为true。
, W; u! u+ e$ `6 H, h9 K2 m' r( H我的内容package-info.java:
! C+ W6 A9 w0 C6 r9 O4 j@GenericGenerator(! q8 T7 ~- ~9 y. Z
    name = "optimized-sequence",
+ o5 O! t0 l4 a* |    strategy = "enhanced-sequence",' Y/ }; k) A$ h/ M8 S/ \& ?
    parameters = {
' T5 Y, {0 ]& i6 f$ X" m        @Parameter(name="prefer_sequence_per_entity", value="true"),/ E1 ]# k6 p& a, ~. {' D' C
        @Parameter(name="optimizer", value="hilo"),
& X- N9 h( O) v( V, @        @Parameter(name="increment_size", value="50")})
9 ?5 w  V) d$ j/ g; ]; A6 Dpackage org.example.model;9 }7 p  |; @) ]
import org.hibernate.annotations.GenericGenerator;
3 h( r# a" e/ S6 Fimport org.hibernate.annotations.Parameter;
+ i. ]" d6 ?0 x0 B! }) j: }在使用方面,您只需要
: h* X0 K" g2 o6 U/ ^. T5 E@Id @GeneratedValue(generator="optimized-sequence")" o- c7 V+ E" \, v& t: R7 |& U
public long id;' `9 K. `4 s: a) m" w7 l' B
我更喜欢使用单独的序列,因为偶尔我会放一个表并重新创建它,并且我希望ID从一个表开始。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则