@Generated 与 @GeneratedValue
您不需要@Generated
与@GeneratedValue
. 注解用于数据库在 INSERT 或 UPDATE 期间生成的@Generated
非 ID 实体属性。有关@Generated
注释的更多详细信息。
另一方面,@GeneratedValue
它仅适用于实体标识符属性,当实体标识符在持久化实体时自动生成时,您需要使用它。
序列发生器
当您持久化实体时,序列生成器需要额外的数据库往返来调用序列对象。出于这个原因,Hibernate 提供了基于序列的优化器来减少获取实体标识符值所需的往返次数。
现在,如果您想使用hilo
,标识符映射将如下所示:
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "post_sequence"
)
@GenericGenerator(
name = "post_sequence",
strategy = "sequence",
parameters = {
@Parameter(name = "sequence_name", value = "post_sequence"),
@Parameter(name = "initial_value", value = "1"),
@Parameter(name = "increment_size", value = "3"),
@Parameter(name = "optimizer", value = "hilo")
}
)
private Long id;
除了必须使用 Hibernate-specific 之外@GenericGenerator
,问题hilo
在于生成的标识符不包括数据库序列值,因此使用数据库的第 3 方客户端将不知道如何生成下一个标识符值,除非他们知道hilo
算法和allocationSize
.
因此,最好使用pooled
or pooled-lo
。
池化优化器
优化器pooled
很容易设置。您需要做的就是设置allocationSize
JPA@SequenceGenerator
注释,Hibernate 将切换到使用pooled
优化器:
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "post_sequence"
)
@SequenceGenerator(
name = "post_sequence",
sequenceName = "post_sequence",
allocationSize = 3
)
private Long id;
池化优化器
要使用 pooled-lo 优化器,只需添加以下配置属性:
<property name="hibernate.id.optimizer.pooled.preferred" value="pooled-lo" />
现在,实体标识符映射与我之前向您展示的pooled
优化器相同。
要了解 pooled-lo 的工作原理,请查看此图:
如果您一直在使用旧版hilo
优化器,您可能希望切换到使用pooled
or pooled-lo
,因为hilo
它无法与可能不知道hilo
标识符分配策略的其他客户端互操作。