java - Hibernate hilo 策略不根据下一个数据库序列值生成值
问题描述
我有一个这样的 jpa 配置:
@Id
//@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_gen")
@GeneratedValue(generator = "timedep_seq_gen")
@GenericGenerator(
name = "seq_gen",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "sequence_myseq"),
@Parameter(name = "initial_value", value = "1"),
@Parameter(name = "increment_size", value = "10"),
@Parameter(name = "optimizer", value ="hilo")
}
)
private Long id;
插入正在创建像 1,2,3.. 这样的 id 值,这很好,直到我手动执行
SELECT nextval('sequence_myseq');
我希望在从 pgadmin(或任何其他客户端)运行上述内容时,jpa/hibernate 生成器生成的下一组值应该跳过 id 列的值,但事实并非如此。它仍然会生成值而不跳过任何 id 值。这里有什么问题 ?
编辑 1
直到我得到一些具体的答案,看起来hilo
优化不适用于多个实例。以下是有效的,但它需要你设置
increment by 10
在您的序列定义中也是如此。
@GeneratedValue(generator = "dep_seq_gen")
@SequenceGenerator(
name = "dep_seq_gen",
sequenceName = "sequence_dep",
allocationSize = 10
)
解决方案
希洛限制
Hilo 算法不能与不知道 hilo 分配方案的系统互操作,这就是 Hibernate 支持pooled
优化器的原因。
池化优化器
与 不同hilo
的是,pooled
优化器将数据库序列值包含在应用程序分配的标识符值中。出于这个原因,任何新的序列值都不会与以前或未来的值发生冲突。
由于pooled
默认使用,您还可以使用 来简化@Id
映射,SequenceGenerator
而不是使用更详细@GenericGenerator
的 for hilo
:
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence_myseq"
)
@SequenceGenerator(
name = "sequence_myseq",
sequenceName = "sequence_myseq",
allocationSize = 3
)
private Long id;
从 hilo 迁移到 pooled
如果您使用hilo
并想迁移到pooled
优化器,则需要更改序列值,否则会产生冲突。
推荐阅读
- rust - 将值附加到 rust 宏中的 args
- python - 如何比较签名?
- redirect - Bigcommerce 在购物车页面上重定向
- terraform - 如何在 Terraform 中获取调用模块的名称
- linux - Bash 脚本无法使用 systemd 启动
- xamarin.ios - 您可以覆盖导航控制器的“InteractivePopGestureRecognizer”操作吗?
- java - Redisson 库不支持 Redis ACL 安全性
- docker - 由于权限不足,无法插入 ClickHouse 数据库:/var/lib/clickhouse/data/
- matlab - Matlab中的嵌套循环
- java - xml xslt 转换:无法在另一个节点中获取一个节点