更新:我已经调查了源代码,并找到了这个魔术技巧 :)
添加参数
@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的创建者可以提供帮助?