栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

spring-Hibernate 5命名策略配置

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring-Hibernate 5命名策略配置

我想我找到了解决方案。

为了实现我的目标,我使用

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>

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407887.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号