由mysql表名大小寫所知道

今天遇到一個問題是: php

在mysql手動建立數據庫表(大寫表名,小寫字段名)後,啓動項目後發現,hibernate又給我生成了一個小寫的同結構表,猜測到會不會是mysql表名區分大小寫後,google一下,果不其然,LINUX下的MYSQL默認是要區分表名大小寫的;聽說有個規則是: java

MYSQL在LINUX下數據庫名、表名、列名、別名大小寫規則以下: 
1.數據庫名與表名是嚴格區分大小寫的 
2.表的別名是嚴格區分大小寫的 
3.列名與列的別名在全部的狀況下均是忽略大小寫的 
4.變量名也是嚴格區分大小寫的   mysql

看到這基本確認是mysql表名大小寫問題,可是忽然想到該項目以前在使用oracle數據庫生成的表名都是大寫,再次google,原來oracle在建表時候,大小寫都是能夠的(默認大寫,小寫的話,加引號),並且查詢的時候不區分大小寫,因此不會出現上面mysql的問題,查詢的大小寫表是兩個表。 redis

但是,我這項目都生成了30多個表,不能讓我挨個修改小寫吧,想到這裏,記起曾經看過hibernate的一個關於從class--》table等命名映射規則類,再次google,查到:原來是只要:「擴展org.hibernate.cfg.ImprovedNamingStrategy 命名策略,而後在配置文件中指向本身的命名配置文件便可」,ok,明白了,開始複寫一個ImprovedNamingStrategy,將裏面的方法tableName修改成 spring

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


最後個人ImprovedNamingStrategy就是: sql

/*
 * 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>
重啓服務,搞定!


參考資料: express

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


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


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

session

相關文章
相關標籤/搜索