原文: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,解压后覆盖plugins\org.hibernate.eclipse_3.2.4.GA-R200905070146-H18\lib\tools\hibernate-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包在plugins\org.hibernate.eclipse_3.2.4.GA-R200905070146-H18\lib\tools\hibernate-tools.jar
pojo\PojoFields.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>
pojo\PojoPropertyAccessors.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>

org\hibernate\tool\hbm2x\TemplateProducer.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);

}

}

}

}
org\hibernate\tool\hbm2x\jtidy.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&characterEncoding=UTF-8&useInformationSchema=true”即可。
- 用hibernate tools生成对应的sql应用代码
参考资料: eclipse在线配置hibernate tools http://jingyan.baidu.com/article/db55b609959d154ba20a2f5d.html [图]H ...
- 用Hibernate Tools生成Hibernate Mapping映射文件
Eclipse中要集成安装Hibernate Tools组件 如果没有,请查看:Eclipse juno 中安装 JBoss Tools,集成Hibernate 一.确定环境: 1.Maven3.0. ...
- 【原创】Hibernate自动生成(1)
本实战是博主初次学习Java,分析WCP源码时,学习HibernateTools部分的实战,由于初次接触,难免错误,仅供参考,希望批评指正. 开发环境: Eclipse Version: Photon ...
- Hibernate Tools for Eclipse的使用
Hibernate Tools的官方网站:http://hibernate.org/tools/Step1.安装好Hibernate Tools,建立一个Dynamic web project,工程名 ...
- Hibernate Tools 自动生成hibernate的hbm文件
本文有待商榷 当我们在新增插件的时候发现会出现duplicate location,意思是所选的anchive所包含的zip路径已经复用,现象如下: 如上图所示黄色标记部分“Duplicate loc ...
- 使用Hibernate Tools从数据库逆向生成Hibernate实体类
自动生成model.java.*.hbm.xml 甚至是dao.java.*.ddl.*.html等等.一般也就如下三种方式1. MyEclipse 自带插件2. jboss的 hibernate-t ...
- Eclipse中通过Hibernate Tools插件实现从数据库逆向生成Hibernate带注解的实体类
一.安装hibernate tools插件 1.在线安装 通过Eclipse的Help->Install New Software 在线安装插件,插件连接为: eclipse helios(3. ...
- 利用Hibernate注解生成表
转自:http://blog.csdn.net/madison__/article/details/55677099 Hibernate4注释 @Entity(name = "tbl_use ...
- eclipse中怎么添加Hibernate tools
最近在学习Hibernate框架,但是用eclipse的时候发现自己安装的过程不是很顺利,因此记下来,供自己和别人参考. Hibernate Tools是由JBoss推出的一个Eclipse集成开发工 ...
随机推荐
- QMessageBox的使用
/** 使用非静态API,属性设置API **/ QMessageBox msgBox; msgBox.setWindowTitle("Note");/** 设置标题 **/ ms ...
- 2017 ACM/ICPC Asia Regional Qingdao Online解题报告(部分)
HDU 6206 Apple 题意: 给出四个点的坐标(每个点的坐标值小于等于1,000,000,000,000),问最后一个点是否在前三个点组成的三角形的外接圆内,是输出Accept,否输出Reje ...
- [转]Angular2-组件间数据传递的两种方式
本文转自:https://www.cnblogs.com/longhx/p/6960288.html Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一 ...
- Layui 获取 radio的值
var OutInvoiceType = $('#OutInvoiceType input[checked]').val(); 就可以获取到了.
- [android] 数据的异步加载和图片保存
把从网络获取的图片数据保存在SD卡上, 先把权限都加上 网络权限 android.permission.INTERNET SD卡读写权限 android.permission.MOUNT_UNMOUN ...
- 【Java】模拟Sping,实现其IOC和AOP核心(二)
接着上一篇,在上一篇完成了有关IOC的注解实现,这一篇用XML的方式实现IOC,并且完成AOP. 简易的IOC框图 注解的方式实现了左边的分支,那么就剩下右边的XML分支: XmlContext:这个 ...
- Spark 跑 java 示例代码
一.下载示例代码: git clone https://github.com/melphi/spark-examples.git 从示例代码中可以看到 pox中引入了 Spark开发所需要的依赖. 二 ...
- ajax文件上传-FormData()
HTML: <form action=""> <input type="file" id="file1" name=&qu ...
- PostgreSQL 10 如何使用 PgAdmin3
自从 PgAdmin4 出来以后,PgAdmin3 就停止开发了,PgAdmin 官网下载的 PgAdmin3 无法支持 PostgreSQL 10 或者更高版本的数据库服务器端. 但是 PgAdmi ...
- 关于BI商业智能的“8大问”|一文读懂大数据BI
这里不再阐述商业智能的概念了,关于BI,就从过往的了解,搜索以及知乎的一些问答,大家困惑的点主要集中于大数据与BI的关系,BI的一些技术问题,以及BI行业和个人职业前景的发展.这里归纳成8个问题点,每 ...