zoukankan      html  css  js  c++  java
  • Hibernate 映射字段问题[ImprovedNamingStrategy]

    Hibernate 使用JPA 对于映射有3种规则能够配置:DefaultNamingStrategy,ImprovedNamingStrategy,EJB3NamingStrategy

    这里仅仅说ImprovedNamingStrategy,其它自行看Hibernate代码,ImprovedNamingStrategy的代码例如以下,是一个singleton instance:


    /*
    * Hibernate, Relational Persistence for Idiomatic Java
    *
    * Copyright (c) 2010, Red Hat Inc. 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 Inc.
    *
    * 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 org.hibernate.cfg;
    
    import java.io.Serializable;
    
    import org.hibernate.util.StringHelper;
    import org.hibernate.AssertionFailure;
    
    /**
    * An improved naming strategy that prefers embedded
    * underscores to mixed case names
    * @see 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);
    }
    /**
     * 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;
    }
    }

    addUnderscores 用于处理 当表名和列名在Java的种规则符合 UserNameTable(表)和 userNameColumn(列),就会被解析为user_name_table 和 user_name_column ,详细return的处理的是propertyToColumnName。 but呢,假设一旦配置了这个规则,spring +jpa配置例如以下:
    -

    <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>

    就会忽略了凝视中的@Column中的name,事实上这个name地方就是为了映射数据库字段,结果配置了这个就不care了。我去。看下hibernate解释
    https://hibernate.atlassian.net/browse/HHH-8616
    认为是这是一个bug,不知道为啥就这样fix bug 了。

    如今有7-8张表的规则没有符合这个怎么办呢, 重写了例如以下。

    /*
    * Copyright 2012-2014 sencloud.com.cn. All rights reserved.
    * Support: http://www.sencloud.com.cn
    * License: http://www.sencloud.com.cn/license
    */
    package com.sencloud.hibernate.cfg;
    
    import java.io.Serializable;
    
    import org.hibernate.cfg.ImprovedNamingStrategy;
    import org.hibernate.cfg.NamingStrategy;
    import org.hibernate.util.StringHelper;
    
    /**
    * ImprovedNamingStrategy- hibernate映射规则
    * 
    * @author xutianlong
    * @version 3.0
    */
    public class MoShopImprovedNamingStrategy extends ImprovedNamingStrategy
        implements NamingStrategy, Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 3088474161734101900L;
    
    public String propertyToColumnName(String propertyName) {
        if (propertyName.endsWith("__")) {
            return propertyName.replace("__", "").toLowerCase();
        }
        return addUnderscores(StringHelper.unqualify(propertyName));
    }
    }

    改下配置:


    <prop key="hibernate.ejb.naming_strategy">com.sencloud.hibernate.cfg.MoShopImprovedNamingStrategy</prop>


    那么怎么使用这个呢? propertyName必须以 "__"结尾了,然后在规则中统一toLowerCase。 有点那个啥了。
    @Column(nullable = false, length=100)
    private String userName__;


  • 相关阅读:
    python小程序:备份文件
    二叉树非递归后序遍历
    python拷贝文件小程序(windows)
    为什么虚拟 dom 会提高性能?
    shouldComponentUpdate 是做什么的,(react 性能优化是哪个周期函数?)
    react 生命周期函数
    调用 setState 之后发生了什么?
    React 中 keys 的作用是什么?
    Windows下如何更新 node.js
    SVN的Branch和Tag管理
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4332440.html
Copyright © 2011-2022 走看看