spring-Hibernate 5命名策略配置

我正在使用postgresql数据库和spring + hibernate框架编写应用程序。

我将spring框架从4.1.5.RELEASE升级到4.2.0.RELEASE版本,并将hibernate框架从4.3.7.Final升级到了5.0.0.Final版本。

升级后,我在NamingStrategy中遇到问题。在postgresql数据库中,表列名称以小写字母用下划线分隔,在应用程序层中,bean属性以驼峰字母表示。

这是旧版本的有效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" class="org.apache.tomcat.jdbc.pool.DataSource" 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" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

<property name="dataSource" ref="microFmsDataSource"/>

<property name="packagesToScan">

<list>

<value>fms</value>

</list>

</property>

<property name="jpaVendorAdapter">

<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />

</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.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />

</map>

</property>

</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

<property name="entityManagerFactory" ref="entityManagerFactory" />

</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

升级后,我更改了NamingStrategy配置:

<entry key="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />

像这样:

<entry key="hibernate.implicit_naming_strategy" value="***" />

并尝试了hibernate javadoc中列出的所有选项的变体:https : //docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/cfg/AvailableSettings.html#IMPLICIT_NAMING_STRATEGY

但没有成功。

您能告诉我Hibernate 5中改进的NamingStrategy的替代方案是什么,并提供一个有效的配置示例吗?

回答:

我想我找到了解决方案。

为了实现我的目标,我使用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" class="org.apache.tomcat.jdbc.pool.DataSource" 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" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

<property name="dataSource" ref="microFmsDataSource"/>

<property name="packagesToScan">

<list>

<value>fms</value>

</list>

</property>

<property name="jpaVendorAdapter">

<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />

</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" class="org.springframework.orm.jpa.JpaTransactionManager">

<property name="entityManagerFactory" ref="entityManagerFactory" />

</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

我希望此解决方案对某人有帮助。

以上是 spring-Hibernate 5命名策略配置 的全部内容, 来源链接: utcz.com/qa/414373.html

回到顶部