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
相关产品推荐
相关产品推荐

