由mysql表名大小写所知道

混江龙づ霸主 提交于 2019-11-29 09:00:10

今天遇到一个问题是:

在mysql手动创建数据库表(大写表名,小写字段名)后,启动项目后发现,hibernate又给我生成了一个小写的同结构表,猜想到会不会是mysql表名区分大小写后,google一下,果不其然,LINUX下的MYSQL默认是要区分表名大小写的;据说有个规则是:

MYSQL在LINUX下数据库名、表名、列名、别名大小写规则如下: 
1.数据库名与表名是严格区分大小写的 
2.表的别名是严格区分大小写的 
3.列名与列的别名在所有的情况下均是忽略大小写的 
4.变量名也是严格区分大小写的  

看到这基本确认是mysql表名大小写问题,但是突然想到该项目之前在使用oracle数据库生成的表名都是大写,再次google,原来oracle在建表时候,大小写都是可以的(默认大写,小写的话,加引号),而且查询的时候不区分大小写,所以不会出现上面mysql的问题,查询的大小写表是两个表。

可是,我这项目都生成了30多个表,不能让我挨个修改小写吧,想到这里,记起曾经看过hibernate的一个关于从class--》table等命名映射规则类,再次google,查到:原来是只要:“扩展org.hibernate.cfg.ImprovedNamingStrategy 命名策略,然后在配置文件中指向自己的命名配置文件即可”,ok,明白了,开始复写一个ImprovedNamingStrategy,将里面的方法tableName修改为

public String tableName(String tableName) {
        return addUnderscores(tableName).toUpperCase();
    }


最后我的ImprovedNamingStrategy就是:

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
 * indicated by the @author tags or express copyright attribution
 * statements applied by the authors.  All third-party contributions are
 * distributed under license by Red Hat Middleware LLC.
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 *
 */
package com.qiyi.act.utils;

import java.io.Serializable;

import org.hibernate.cfg.NamingStrategy;
import org.hibernate.util.StringHelper;
import org.hibernate.AssertionFailure;

/**
 * An improved naming strategy that prefers embedded
 * underscores to mixed case names
 * @see org.hibernate.cfg.DefaultNamingStrategy the default strategy
 * @author Gavin King
 */
public class ImprovedNamingStrategy implements NamingStrategy, Serializable {

    /**
     * A convenient singleton instance
     */
    public static final NamingStrategy INSTANCE = new ImprovedNamingStrategy();

    /**
     * Return the unqualified class name, mixed case converted to
     * underscores
     */
    public String classToTableName(String className) {
        return addUnderscores( StringHelper.unqualify(className) );
    }
    /**
     * Return the full property path with underscore seperators, mixed
     * case converted to underscores
     */
    public String propertyToColumnName(String propertyName) {
        return addUnderscores( StringHelper.unqualify(propertyName) );
    }
    /**
     * Convert mixed case to underscores
     */
    public String tableName(String tableName) {
        return addUnderscores(tableName).toUpperCase();
    }
    /**
     * Convert mixed case to underscores
     */
    public String columnName(String columnName) {
        return addUnderscores(columnName);
    }

    protected static String addUnderscores(String name) {
        StringBuffer buf = new StringBuffer( name.replace('.', '_') );
        for (int i=1; i<buf.length()-1; i++) {
            if (
                    Character.isLowerCase( buf.charAt(i-1) ) &&
                            Character.isUpperCase( buf.charAt(i) ) &&
                            Character.isLowerCase( buf.charAt(i+1) )
                    ) {
                buf.insert(i++, '_');
            }
        }
        return buf.toString().toLowerCase();
    }

    public String collectionTableName(
            String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
            String propertyName
    ) {
        return tableName( ownerEntityTable + '_' + propertyToColumnName(propertyName) );
    }

    /**
     * Return the argument
     */
    public String joinKeyColumnName(String joinedColumn, String joinedTable) {
        return columnName( joinedColumn );
    }

    /**
     * Return the property name or propertyTableName
     */
    public String foreignKeyColumnName(
            String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
    ) {
        String header = propertyName != null ? StringHelper.unqualify( propertyName ) : propertyTableName;
        if (header == null) throw new AssertionFailure("NamingStrategy not properly filled");
        return columnName( header ); //+ "_" + referencedColumnName not used for backward compatibility
    }

    /**
     * Return the column name or the unqualified property name
     */
    public String logicalColumnName(String columnName, String propertyName) {
        return StringHelper.isNotEmpty( columnName ) ? columnName : StringHelper.unqualify( propertyName );
    }

    /**
     * Returns either the table name if explicit or
     * if there is an associated table, the concatenation of owner entity table and associated table
     * otherwise the concatenation of owner entity table and the unqualified property name
     */
    public String logicalCollectionTableName(String tableName,
                                             String ownerEntityTable, String associatedEntityTable, String propertyName
    ) {
        if ( tableName != null ) {
            return tableName;
        }
        else {
            //use of a stringbuffer to workaround a JDK bug
            return new StringBuffer(ownerEntityTable).append("_")
                    .append(
                            associatedEntityTable != null ?
                                    associatedEntityTable :
                                    StringHelper.unqualify( propertyName )
                    ).toString();
        }
    }
    /**
     * Return the column name if explicit or the concatenation of the property name and the referenced column
     */
    public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
        return StringHelper.isNotEmpty( columnName ) ?
                columnName :
                StringHelper.unqualify( propertyName ) + "_" + referencedColumn;
    }
}

最后,在spring配置文件的sessionFactory属性中加入:

<property name="namingStrategy">
    <bean class="com.wayne.utils.ImprovedNamingStrategy"/>
</property>
重启服务,搞定!


参考资料:

http://blog.csdn.net/wocjj/article/details/7415200


http://bbs.csdn.net/topics/10356601


http://s.yanghao.org/program/viewdetail.php?i=120816

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!