Hibernate 6 迁移 - 序列 ID 生成

3

我有一个基础实体。我有一个每个实体策略的序列。增量大小为100。 根据Hibernate 6文档, 默认策略是每个实体的序列。 但我找不到设置默认增量大小为100的方法。

我该如何迁移下面的代码以适用于Hibernate 6。

@Getter
@Setter
@MappedSuperclass
@Audited
public abstract class AbstractEntity {

    @Id
    @GeneratedValue(generator = "optimized-sequence")
    @GenericGenerator(
        name = "optimized-sequence",
        strategy = "enhanced-sequence",
        parameters = {
            @Parameter(name = SequenceStyleGenerator.CONFIG_PREFER_SEQUENCE_PER_ENTITY, value = "true"),
            @Parameter(name = SequenceStyleGenerator.INCREMENT_PARAM, value = "100")})
    private Long id;

2个回答

1
更新:我已经调查了源代码,并找到了这个魔术技巧 :) 添加参数@Parameter(name = SequenceStyleGenerator.CONFIG_SEQUENCE_PER_ENTITY_SUFFIX, value = "_SEQ"),即
@Id
@GeneratedValue(generator = "optimized-sequence")
@GenericGenerator(
    name = "optimized-sequence",
    strategy = "enhanced-sequence",
    parameters = {
        @Parameter(name = SequenceStyleGenerator.CONFIG_SEQUENCE_PER_ENTITY_SUFFIX, value = "_SEQ"),
        @Parameter(name = SequenceStyleGenerator.INCREMENT_PARAM, value = "100")})
private Long id;

这个方法会起作用。你将同时拥有:按实体排序和自定义生成器设置。
这是一个详细的解释。 似乎Hibernate 6在这种情况下存在问题。 如果你想保持SEQUENCE_PER_ENTITY策略,那么初始值和其他配置参数也无法设置。
根据文档说明。
SEQUENCE_PER_ENTITY策略现在是默认策略,所以他们从SequenceStyleGenerator中移除了@Parameter (name = "prefer_sequence_per_entity", value = "true")。你不能再这样做了。
@GenericGenerator (name = "optimized_sequence_per_entity", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = { @Parameter (name = "prefer_sequence_per_entity", value = "true"), @Parameter (name = "initial_value", value = "10000"), @Parameter (name = "increment_size", value = "100") })
只有这个
    @GenericGenerator (name = "my_generic_generator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
        @Parameter (name = "initial_value", value = "10000"),
        @Parameter (name = "increment_size", value = "10")

SEQUENCE_PER_ENTITY策略是默认的,直到你在@GeneratedValue中指定一个序列名称。你可以通过设置以下方式来实现: @GeneratedValue(generator = "my_generic_generator") 或者@GeneratedValue(generator = "any_string_I_like")
这里的生成器名称不必是真正的生成器名称,它可以是任何字符串,但一旦你在这里指定了某个值,SEQUENCE_PER_ENTITY策略就会被有效取消,因为生成器名称现在被用作序列名称,并且规则 + _seq不再适用。
所以我们不能在生成器级别上指定SEQUENCE_PER_ENTITY策略,也不能在@GeneratedValue级别上指定allocation_size(和其他参数)。为了做到这一点,我们必须创建一个生成器(不指定SEQUENCE_PER_ENTITY策略),并在@GeneratedValue中提及它。但一旦我们这样做了,SEQUENCE_PER_ENTITY策略就会被取消。
现在看起来唯一的可能性是,如果你想继续使用Hibernate 6而不是回退到5,直到bug修复,那么就需要创建一个自定义生成器并使用新的@IdGeneratorType注解。

https://docs.jboss.org/hibernate/orm/6.2/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators

或者有一些魔法技巧可以做到这一点,但这些技巧并没有记录下来,也不容易猜到。但在我看来,这只是他们没有考虑到的情况,当你需要满足以下三个要求时:
  • 在一个BaseEntity上设置Id生成器,并用@MappedSuperclass进行注解
  • 使用SEQUENCE_PER_ENTITY策略
  • 使用生成器来设置一些参数,比如increment_size
也许,Hibernate的创建者可以提供帮助?

1
做得很好!将文档澄清是个好主意。 - Danilo Mz
谢谢 :) 我也这么认为,也许我会提出一个请求 - undefined

0
我不确定为什么这对你不起作用,但有一个可能是序列名称optimized-sequence不唯一,所以你选择了生成器的不同配置。请参见https://hibernate.atlassian.net/browse/HHH-16520
不要使用@GenericGenerator,而要使用JPA标准的@SequenceGenerator

请看我上面的回答。@SequenceGenerator也不起作用。似乎这是新版本的问题。 - Sve Kamenska

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接