我想我找到了解决方案。
为了实现我的目标,我使用
hibernate.physical_naming_strategy配置而不是
hibernate.implicit_naming_strategy。
我创建了
PhysicalNamingStrategy接口的实现,该接口模拟了原始
ImprovedNamingStrategy类的部分功能:
package fms.util.hibernate;import org.apache.commons.lang.StringUtils;import org.hibernate.boot.model.naming.Identifier;import org.hibernate.boot.model.naming.PhysicalNamingStrategy;import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;public class ImprovedNamingStrategy implements PhysicalNamingStrategy { @Override public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } @Override public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } @Override public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } @Override public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } @Override public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } private Identifier convert(Identifier identifier) { if (identifier == null || StringUtils.isBlank(identifier.getText())) { return identifier; } String regex = "([a-z])([A-Z])"; String replacement = "$1_$2"; String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase(); return Identifier.toIdentifier(newName); }}创建此类后,我从以下位置更改了配置:
<entry key="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
对此:
<entry key="hibernate.physical_naming_strategy" value="fms.util.hibernate.ImprovedNamingStrategy" />
现在一切正常。
此解决方案仅覆盖的一小部分
ImprovedNamingStrategy。在我的项目中,对于表映射和联接映射,我总是显式指定表或联接列的名称。我仅对列名依赖隐式名称转换。所以这个简单的解决方案对我来说是可以接受的。
这是我的Spring配置文件的完整示例:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:component-scan base-package="fms" /> <bean id="microFmsDataSource" destroy-method="close"> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="url" value="***" /> <property name="username" value="***" /> <property name="password" value="***" /> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="true" /> <property name="testWhileIdle" value="true" /> <property name="validationQuery" value="select 1" /> <property name="initialSize" value="5" /> <property name="minIdle" value="10" /> <property name="maxIdle" value="100" /> <property name="maxActive" value="100" /> <property name="removeAbandoned" value="true" /> </bean> <bean id="entityManagerFactory" > <property name="dataSource" ref="microFmsDataSource"/> <property name="packagesToScan"> <list> <value>fms</value> </list> </property> <property name="jpaVendorAdapter"> <bean /> </property> <property name="jpaPropertyMap"> <map> <entry key="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" /> <entry key="hibernate.hbm2ddl.auto" value="validate" /> <entry key="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> <entry key="hibernate.show_sql" value="true" /> <entry key="hibernate.format_sql" value="true" /> <entry key="hibernate.physical_naming_strategy" value="fms.util.hibernate.ImprovedNamingStrategy" /> </map> </property> </bean> <bean id="transactionManager" > <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/></beans>
我希望此解决方案对某人有帮助。



