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

Spring+Hibernate中自定义PhysicalNamingStrategy Bean实例化方式咨询

解决Spring+Hibernate中自定义PhysicalNamingStrategy依赖Spring上下文的问题

我之前也碰到过完全一样的场景——要把Spring上下文里的信息传给自定义的命名策略,用配置文件那套确实行不通,因为Hibernate会自己实例化策略类,根本走不到Spring的依赖注入流程。下面是我亲测有效的解决方案:

1. 改造自定义PhysicalNamingStrategy,支持Spring依赖注入

首先让你的策略类通过构造函数接收需要的Spring Bean,比如:

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {
    private final AppConfigProperties appConfig; // 假设这是你需要的Spring上下文里的配置Bean

    // 构造函数注入,Spring会自动帮你装配依赖
    public CustomPhysicalNamingStrategy(AppConfigProperties appConfig) {
        this.appConfig = appConfig;
    }

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        // 这里就可以用appConfig里的信息来生成表名了
        String prefixedTableName = appConfig.getDbTablePrefix() + name.getText().toLowerCase();
        return Identifier.toIdentifier(prefixedTableName);
    }

    // 别忘了实现其他required的方法,比如toPhysicalColumnName等
}

2. 在Spring配置类中声明该策略为Bean

接下来把你的自定义策略类注册成Spring Bean,这样Spring会负责它的实例化和依赖注入,同时Hibernate会自动检测到这个Bean并使用它:

@Configuration
public class PersistenceConfig {
    @Autowired
    private AppConfigProperties appConfigProperties;

    @Bean
    public PhysicalNamingStrategy physicalNamingStrategy() {
        return new CustomPhysicalNamingStrategy(appConfigProperties);
    }
}

3. 关键:移除配置文件中的属性配置

一定要把application.properties或者application.yml里的spring.jpa.hibernate.naming.physical-strategy配置删掉!因为如果同时存在配置文件属性和Spring Bean,Hibernate会优先使用配置文件指定的策略,那你的Bean就白注册了。

为什么之前只能用配置文件实例化?

如果直接在配置文件里指定策略类的全限定名,Hibernate是通过反射自己new这个类的,完全不经过Spring容器,自然没法注入Spring上下文里的任何Bean。而通过Spring Bean的方式,实例由Spring管理,依赖注入正常生效,Hibernate也会自动识别并使用这个Bean,完美解决你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:54:21