hibernate5自定义physicalNamingStrategy实现某些表加后缀的功能

公司的项目,有很多个版本,然后某些版本的同名表的表结构不同,但是我们数据库环境只有一套。于是就想有没有办法,不改代码就实现某些物理表名自动加后缀的功能。要做到生产包无影响,本地测试才加后缀。
一,先配置自定义的物理表名获取策略


    <!-- 配置hibernate5的SessionFactory -->
    <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${dialect}</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
          <!-- 配置物理表名获取策略 -->
        <property name="physicalNamingStrategy" ref="customPhysicalNamingStrategy"/>
      
        <property name="packagesToScan" value="com.xxx.**.model"/>
    </bean>
     <!-- 自定义物理表名获取策略 -->
    <bean id="customPhysicalNamingStrategy" class="com.xxx.config.TableSuffixPhysicalNamingStrategy"/>

二,自定义策略类

package com.xxx.config;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.beans.factory.annotation.Value;

import java.util.Objects;

/**
 * 给某些表一个指定的后缀
 */
public class TableSuffixPhysicalNamingStrategy extends PhysicalNamingStrategyStandardImpl {
    /**
     * 表名
     */
    @Value("${physicalNamingStrategy.tableName:}")
    private String tableName;
    /**
     * 后缀
     */
    @Value("${physicalNamingStrategy.suffix:}")
    private String suffix;

    @Value("${hibernate.addTableSuffix:false}")
    private Boolean addTableSuffix;

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

        String name = identifier.getText();
        if (Objects.nonNull(addTableSuffix) && addTableSuffix.booleanValue()) {
            String[] tableNameArr = tableName.split(",");
            for (String desc : tableNameArr) {
                if (name.equals(desc)) {
                    name = name + suffix;
                    break;
                }
            }
        }

        return Identifier.toIdentifier(name);
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
}

三,增加配置

add_table_suffix=true
physicalNamingStrategy.tableName=T_TEST
physicalNamingStrategy.suffix=_XX

Guess you like

Origin blog.csdn.net/weixin_43472847/article/details/122348913