SpringMVC下整合Hibernate5启用实体类驼峰命令转数据库表字段下划线实现

2022-05-02 1007点热度 0人点赞 0条评论

前面的文章介绍了Spring/SpringBoot下Hibernate开启字段驼峰命名转数据库字段下划线的方式,详见:https://blog.terrynow.com/2022/04/22/spring-springboot-hibernate-auto-convert-pojo-camel-to-underline-strategy/

如果项目是使用的 SpringMVC+Hibernate,也需要让实体类的驼峰命令转数据库字段的下划线,要怎么做呢,同样本人也是测试了网上说的hibernate.physical_naming_strategy改physicalNamingStrategy 无效,经过自己的理解,解决了问题

问题解决方法

新增Camel2SnakeNamingStrategy.java

package com.terrynow.test.util;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

/**
 * @author Terry
 * @date 2022/4/23 15:34
 * @description
 */
public class Camel2SnakeNamingStrategy extends PhysicalNamingStrategyStandardImpl {
    @Override
    public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    private Identifier convertToSnakeCase(final Identifier identifier) {
        if (identifier == null) {
            return null;
        }
        final String newName = identifier.getText().replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase();
        return Identifier.toIdentifier(newName);
    }
}

修改application-context.xml

网上查到很多关于增加hibernate.physical_naming_strategy的方式无效(本人亲测),而是应该在sessionFactory下增加physicalNamingStrategy,详见配置如下(主要看myCamel2SnakeNamingStrategy的部分,其他配置根据自己情况做调整):

<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright (c) 2020.
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  ~
  -->

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:task="http://www.springframework.org/schema/task"
       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-4.1.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task.xsd">

    <context:annotation-config/>
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <context:component-scan base-package="com.terrynow.jmgr"/>
    <!-- 自动扫描该路径的所有注解 -->

    <!-- 配置SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.terrynow.jmgr.entity"/>
        <property name="physicalNamingStrategy" ref="myCamel2SnakeNamingStrategy"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</prop>
                <!--<prop key="hibernate.hbm2ddl.auto">update</prop>-->
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>

    </bean>
    <bean id="myCamel2SnakeNamingStrategy" class="com.terrynow.test.util.Camel2SnakeNamingStrategy" />

    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>${jdbc.driverClassName}</value>
        </property>
        <property name="url">
            <value>${jdbc.url}</value>
        </property>
        <property name="username">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <!-- 	<tx:annotation-driven mode="aspectj" /> -->


    <task:annotation-driven />
</beans>

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论