Hibernate未加载自定义PhysicalNamingStrategy的问题排查与解决
问题原因及修复方案
1. 替换Spring的Hibernate SessionFactory Bean类
你当前使用的org.springframework.orm.hibernate5.LocalSessionFactoryBean是适配Hibernate 5的类,和Hibernate 6不兼容,会导致部分配置无法被正确识别。需要替换为Spring 6中适配Hibernate 6的版本:
<bean id="sessionFactory" class="org.springframework.orm.hibernate6.LocalSessionFactoryBean"> <!-- 其他配置保持不变 --> </bean>
2. 使用Hibernate 6正确的配置键
Hibernate 6中,物理命名策略的配置键已变更为hibernate.naming.physical-strategy(连字符分隔,而非下划线),替换你配置中的旧键:
<prop key="hibernate.naming.physical-strategy">com.mydomain.CustomPhysicalNamingStrategyStandardImpl</prop>
3. 确保自定义命名策略的实现符合Hibernate 6要求
- 确认你的
CustomPhysicalNamingStrategyStandardImpl实现的是Hibernate 6的org.hibernate.boot.model.naming.PhysicalNamingStrategy接口,而非旧版本接口。 - 所有接口方法不能返回
null,否则Hibernate会 fallback到默认实现。示例实现:
import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; public class CustomPhysicalNamingStrategyStandardImpl implements PhysicalNamingStrategy { @Override public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnvironment) { return identifier != null ? Identifier.toIdentifier(identifier.getText().toLowerCase()) : identifier; } @Override public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnvironment) { return identifier != null ? Identifier.toIdentifier(identifier.getText().toLowerCase()) : identifier; } @Override public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnvironment) { return identifier != null ? Identifier.toIdentifier(identifier.getText().toLowerCase()) : identifier; } @Override public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnvironment) { return identifier != null ? Identifier.toIdentifier(identifier.getText().toLowerCase()) : identifier; } }
验证方法
可以在自定义策略的方法中添加日志打印,或通过调试断点确认Hibernate是否调用了你的自定义实现类,以此验证配置是否生效。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

