• Hibernate Tools生成注释


    原文:http://www.blogjava.net/pauliz/archive/2009/11/13/302162.html

    有同学需要修改后的Hibernate Tools
    整个tool我就不上传了,需要的请到http://downloads.sourceforge.net/jboss/HibernateTools-3.2.4.GA-R200905070146-H18.zip 或者 http://files.cnblogs.com/eggbucket/hibernate-tools.zip下载。

    hibernate-tools.zip
        是修改后的jar,解压后覆盖pluginsorg.hibernate.eclipse_3.2.4.GA-R200905070146-H18lib oolshibernate-tools.jar
    template.zip 或者 http://files.cnblogs.com/eggbucket/template.zip
        是ftl模板,Hibernate Code Generation Configuration中Main选项卡最下面Template directory可指定使用自定义的模板

    template.zip只是在默认的模板上做了少量修改,抛砖引玉了,如果各位有更好的模板,也希望能为大家共享一下

    最近做项目时,使用Hibernate Tools 3.2.4生成entity和hbm.xml,但默认情况下,DB中的comments没法生成到javadoc和xml中,改了templates倒是有注释了,但却是乱码,心里一直耿耿于怀...(这不符合咱一直强调的编码规范不是?最主要的是人懒,有时用entity不想再找文档)。在网上找了半天,大多说是freemarker编码设置问题,但不管怎么设置,都没一点效果,决定自己动手。下了源码,查到原因,人家压根就没处理中文问题。记录一下处理过程。

    ftl是freemarker模板,可以在jar包外使用,java和properties重新打包替换hibernate-tools.jar,如果是eclipse-plugins,jar包在pluginsorg.hibernate.eclipse_3.2.4.GA-R200905070146-H18lib oolshibernate-tools.jar

    pojoPojoFields.ftl

    <#-- // Fields -->

    <#foreach field in pojo.getAllPropertiesIterator()><#if pojo.getMetaAttribAsBool(field, "gen-property"true)>    /** *//**
    <#if pojo.hasMetaAttribute(field, "field-description")>
         ${pojo.getFieldJavaDoc(field, 0)}
    </#if>
    <#foreach column in field.columnIterator><#if column.comment?exists && column.comment?trim?length!=0>     * ${column.comment}.
    </#if>
    </#foreach>
         
    */

        $
    {pojo.getFieldModifiers(field)} ${pojo.getJavaTypeName(field, jdk5)} ${field.name}<#if pojo.hasFieldInitializor(field, jdk5)> = ${pojo.getFieldInitialization(field, jdk5)}</#if>;
    </#if>
    </#foreach>


    pojoPojoPropertyAccessors.ftl

    <#-- // Property accessors -->
    <#foreach property in pojo.getAllPropertiesIterator()>
    <#if pojo.getMetaAttribAsBool(property, "gen-property"true)>
        /**  
    <#if pojo.hasFieldJavaDoc(property)>    
         * ${pojo.getFieldJavaDoc(property, 4)}
    </#if>
    <#foreach column in property.columnIterator><#if column.comment?exists && column.comment?trim?length!=0>     * 取得 ${column.comment}.
    </#if>
    </#foreach>
         */

        <#include "GetPropertyAnnotation.ftl"/>
        ${pojo.getPropertyGetModifiers(property)} ${pojo.getJavaTypeName(property, jdk5)} ${pojo.getGetterSignature(property)}() {
            return this.${property.name};
        }


        /**
    <#if pojo.hasFieldJavaDoc(property)>    
         * ${pojo.getFieldJavaDoc(property, 4)}
    </#if>
    <#foreach column in property.columnIterator><#if column.comment?exists && column.comment?trim?length!=0>     * 设置 ${column.comment}.
    </#if>
    </#foreach>
         */
       
        ${pojo.getPropertySetModifiers(property)} void set${pojo.getPropertyName(property)}(${pojo.getJavaTypeName(property, jdk5)} ${property.name}{
            this.${property.name} = ${property.name};
        }

    </#if>
    </#foreach>


    orghibernate oolhbm2xTemplateProducer.java

    public void produce(Map additionalContext, String templateName, File destination, String identifier, String fileType, String rootContext) {
            
            String tempResult = produceToString( additionalContext, templateName, rootContext );
            
            if(tempResult.trim().length()==0) {
                log.warn("Generated output is empty. Skipped creation for file " + destination);
                return;
            }

            FileWriter fileWriter null;
            Writer fileWriter = null;
            try {
                
                th.ensureExistence( destination );    
             
                ac.addFile(destination, fileType);
                log.debug("Writing " + identifier + " to " + destination.getAbsolutePath() );
                fileWriter new FileWriter(destination);
                fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destination), "UTF-8"));

                fileWriter.write(tempResult);            
            }
     
            catch (Exception e) {
                throw new ExporterException("Error while writing result to file", e);    
            }
     finally {
                if(fileWriter!=null{
                    try {
                        fileWriter.flush();
                        fileWriter.close();
                    }

                    catch (IOException e) {
                        log.warn("Exception while flushing/closing " + destination,e);
                    }
                    
                }

            }

            
        }


    orghibernate oolhbm2xjtidy.properties

    indent=auto
    indent-spaces=4
    #indent-attributes=yes
        wrap=180
    markup=yes
    clean=yes
    output-xml=yes
    input-xml=yes
    show-warnings=yes
    trim-empty-elements=yes
    input-encoding=utf-8
    output-encoding=utf-8


    补充:
    无法取得MySQL5 Table的Comments,修改org.hibernate.cfg.reveng.dialec.MySQLMetaDataDialect
    重载getTables方法

    /**
         * MetaData中无法取得table Comment,重载
         
    */

        @Override
        
    public Iterator getTables(String xcatalog, String xschema, String xtable) {
            try {
                final String catalog = caseForSearch(xcatalog);
                final String schema = caseForSearch(xschema);
                final String table = caseForSearch(xtable);

                log.debug("getTables(" + catalog + "." + schema + "." + table + ")");

                ResultSet tableRs = getMetaData().getTables(catalog, schema, table, new String[] { "TABLE", "VIEW" });

                return new ResultSetIterator(tableRs, getSQLExceptionConverter()) {

                    Map element = new HashMap();

                    protected Object convertRow(ResultSet tableResultSet) throws SQLException {
                        element.clear();
                        putTablePart(element, tableResultSet);
                        element.put("TABLE_TYPE", tableResultSet.getString("TABLE_TYPE"));

                        String remarks = tableResultSet.getString("REMARKS");
                        if (StringHelper.isEmpty(remarks)) {
                            String sql = "show table status " + (schema == null ? "" : " from " + schema + " ") + " like '"
                                    + element.get("TABLE_NAME") + "' ";
                            PreparedStatement statement = getConnection().prepareStatement(sql);

                            ResultSet tableRs = statement.executeQuery();

                            if (tableRs.next()) {
                                remarks = tableRs.getString("COMMENT");
                            }

                        }

                        element.put("REMARKS", remarks);
                        return element;
                    }


                    protected Throwable handleSQLException(SQLException e) {
                        // schemaRs and catalogRs are only used for error reporting if
                        
    // we get an exception
                        String databaseStructure = getDatabaseStructure(catalog, schema);
                        throw getSQLExceptionConverter().convert(
                                e,
                                "Could not get list of tables from database. Probably a JDBC driver problem. "
                                        + databaseStructure, null);
                    }

                }
    ;
            }
     catch (SQLException e) {
                // schemaRs and catalogRs are only used for error reporting if we get an exception
                String databaseStructure = getDatabaseStructure(xcatalog, xschema);
                throw getSQLExceptionConverter().convert(e,
                        "Could not get list of tables from database. Probably a JDBC driver problem. " + databaseStructure,
                        null);
            }

        }


    外键默认生成List,修改org.hibernate.cfg.JDBCBinder

    /**
         * 
    @param rc
         * 
    @param processed
         * 
    @param table
         * 
    @param object
         
    */

        
    private Property bindOneToMany(PersistentClass rc, ForeignKey foreignKey, Set processed, Mapping mapping) {

            Table collectionTable = foreignKey.getTable();
            Collection collection = new org.hibernate.mapping.Set(rc); // MASTER TODO: allow overriding collection type
            Collection collection = new org.hibernate.mapping.Bag(rc); // MASTER TODO: allow overriding collection type
    。。。
     
    关于无法取得MySQL5 Table的Comments的问题,楼主的修改源码的方案是可行的。当我从GitHub获取了hibernate-tools源码,并修改了“org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect”类之后,问题解决了。
    这时候,我突然想到个问题,既然是通过JDBC获取数据库元信息,没有获取到,应该是数据库厂商JDBC驱动有问题,为什么要去修改hibernate-tools的源码呢?
    最后我找到了MySQL驱动的这个bug(http://bugs.mysql.com/bug.php?id=65213),并从该bug页找到了解决方案:
    修改MySQL JDBC驱动URL,在其后追加:“?useUnicode=true&amp;characterEncoding=UTF-8&amp;useInformationSchema=true”即可。
     
     
     
     
  • 相关阅读:
    自增主键强制修改
    网页速度优化
    JS 获取字符串长度, 区别中英文
    SQL时间相关 SQL日期,时间比较
    关于document.cookie的使用
    php文件头部空白影响CSS布局 2
    FlvPlayer 播放器代码
    JAVA——继承、多态、重载和重写转
    JS星级评分,带提示(转)
    web 启动 本地应用程序 Activity
  • 原文地址:https://www.cnblogs.com/eggbucket/p/3240991.html
Copyright © 2020-2023  润新知