You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring上下文自定义序列生成器与Hibernate实例冲突问题求助

解决Hibernate 6 + Spring Boot 3中自定义序列生成器受Spring上下文管理的问题

核心逻辑

Hibernate 6默认会自行实例化自定义IdentifierGenerator,要让Spring接管实例管理,需通过自定义工厂类将Spring上下文与Hibernate的生成器创建流程打通。

具体实现步骤

1. 调整自定义序列生成器

保留@Component让Spring扫描管理,同时实现Hibernate 6的IdentifierGenerator接口:

@Component
public class CustomSequenceGenerator implements IdentifierGenerator {

    @Value("${value.from.property.file}")
    private String configValue;

    @Override
    public Object generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
        // 这里使用注入的configValue实现序列生成逻辑
        return generateCustomSequence(session, object);
    }

    // 自定义序列生成逻辑
    private Object generateCustomSequence(SharedSessionContractImplementor session, Object object) {
        // 编写你的生成逻辑
    }
}

2. 实现Spring托管的生成器工厂

创建实现HibernateIdentifierGeneratorFactory的类,从Spring上下文获取生成器实例:

@Component
public class SpringManagedGeneratorFactory implements IdentifierGeneratorFactory {

    private final ApplicationContext applicationContext;

    public SpringManagedGeneratorFactory(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Override
    public IdentifierGenerator createIdentifierGenerator(
            GeneratorCreationContext creationContext,
            String generatorName,
            Type identifierType,
            Map<String, Object> configValues) {
        // 匹配自定义生成器时,从Spring上下文取实例
        if (CustomSequenceGenerator.class.getName().equals(generatorName)) {
            return applicationContext.getBean(CustomSequenceGenerator.class);
        }
        // 其他生成器交给Hibernate默认处理
        return creationContext.getIdentifierGeneratorFactory().createIdentifierGenerator(
                creationContext, generatorName, identifierType, configValues);
    }
}

3. 配置Hibernate使用自定义工厂

通过HibernatePropertiesCustomizer将自定义工厂注入Hibernate配置:

@Component
public class HibernateConfigCustomizer implements HibernatePropertiesCustomizer {

    private final SpringManagedGeneratorFactory generatorFactory;

    public HibernateConfigCustomizer(SpringManagedGeneratorFactory generatorFactory) {
        this.generatorFactory = generatorFactory;
    }

    @Override
    public void customize(Map<String, Object> hibernateProperties) {
        hibernateProperties.put(
                AvailableSettings.IDENTIFIER_GENERATOR_FACTORY,
                generatorFactory
        );
    }
}

4. 实体类中指定生成器

在实体的@GeneratedValue中关联自定义生成器:

@Entity
public class YourEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "custom-seq-gen")
    @GenericGenerator(
            name = "custom-seq-gen",
            type = CustomSequenceGenerator.class
    )
    private Long id;

    // 其他字段与方法
}

关键说明

  • 配置完成后,Hibernate会通过自定义工厂获取Spring管理的CustomSequenceGenerator实例,@Value注入的配置值将正常生效。
  • 若有多个自定义生成器,可在SpringManagedGeneratorFactory中扩展匹配逻辑,统一从Spring上下文获取实例。

内容的提问来源于stack exchange,提问作者lemoncodes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:48:14