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

