- 浏览: 3466297 次
- 性别:
- 来自: 珠海
-
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
Eclipse 中Hibernate tools 的安装和使用 http://zhoualine.iteye.com/blog/1190141
源码里面有一个很好的格式化类:org.hibernate.tool.hbm2x.XMLPrettyPrinter
调用
获得源码的方法:
https://github.com/hibernate/hibernate-tools, 然后建立maven工程
得到源码后需要处理的问题:
1.修改pom.xml的name等信息,来适合自己建立的工程。
2.注释掉pom.xml一些没必要的数据库信息。
3.注释几个地方
4.加入sql server driver,先执行mavn
mvn install:install-file -Dfile=/mnt/D/work_documents/jar2mvn/sqljdbc-4.0.jar -DgroupId=sqljdbc -DartifactId=sqljdbc -Dversion=4.0 -Dpackaging=jar
再加入依赖:
5. 加入
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/config/hibernate.cfg.xml
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/com/pandy/RunHibernateTools.java
可能要适当修改
6.增加一个存放代码的文件夹
/mnt/D/work_documents/workspace_ide/HibernateTools/codes
7. /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java 增加一个方法:
mian方法修改:
8.生成的DAO后缀是Home,要是改成XxxxDAO,以DAO为后缀。
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/DAOExporter.java, 修改以下方法为:
9.模板文件,如果生成的代码需要修改,可以修改模板,路径为
/mnt/D/work_documents/workspace_ide/HibernateTools/src/templates
10. 配置需要生成代码的表
A: 跟踪代码
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java
前面有一段static代码,里面有 ge.getConfiguration().getClassMappings(),ge.getConfiguration()里面有一个tables属性,映射了table=>java file.
B:到/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/AbstractExporter.java 去查看这个configuration到底怎么初始化?
可以看到它的初始化是GenericExporter构造函数里面传入。那么就要找到什么时候创建GenericExporter?
C:
它是在POJOExporter构造函数里面,那么就在main函数的POJOExporter exporter = new POJOExporter(cfg, getOutputDir(properties));创建。
D:到main函数更在cfg的创建,并监视里面的tables什么时候有值?cfg.readFromJDBC()这里被赋值,继续跟踪。
D: 跟踪到/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCBinder.java,readFromDatabase()方法DatabaseCollector collector = readDatabaseSchema(catalog, schema),被赋值。
E: 让它继续找,我们只是在生成的时候过滤掉就可以了。那么回到A,在这里做手脚。
-----------
I: /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/config/hibernate.cfg.xml增加一个
II:/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java最后面增加
III: /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java修改static段的代码:
这样就搞定了。可以模仿做排除功能。
11.打包成jar, 参考:http://panyongzheng.iteye.com/blog/1759912,http://sundful.iteye.com/blog/1850070,修改pom.xml使用maven-compiler-plugin插件的java版本为1.7。 并修改插件的版本号http://qiang106.iteye.com/blog/1388645,
命令为:
测试并打包:mvn -e clean package
不需要测试打包:mvn -e clean package -DskipTests
复制源码,不测试打包:mvn clean assembly:assembly -DskipTests
12.执行jar:
复制得到依赖jar: mvn dependency:copy-dependencies -DoutputDirectory=target/lib
执行不含源码jar:java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar
执行含源码的jar:java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1-jar-with-dependencies.jar
最后的打包并执行的两个命令:
mvn -e clean package dependency:copy-dependencies -DskipTests -DoutputDirectory=target/lib
java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar
13.执行是输入hibernate.cfg.xml文件路径
A:修改run方法,增加一个hibernate.cfg.xml的绝对路径参数,并注释掉原本硬编码路径:
B:修改mian方法:
最终执行命令: java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar /mnt/D/work_documents/workspace_ide/HibernateTools/hibernate.cfg.xml
14.POJO的源码主键生成
org.hibernate.tool.hbm2x.pojo.EntityPOJOClass, generateAnnIdGenerator()方法。因为不知道怎么传入主键的配置,所以尝试在这里修改。我改成了:要么是uuid,要么是auto类型,这个是自己的需求。
修改源码默认产生equal,toString,hashCode方法:
/mnt/D/work_documents/workspace_ide_linux/HibernateTools/src/java/org/hibernate/tool/hbm2x/pojo/BasicPOJOClass.java
toString:
equal & hashCode:
修改版本号信息:
/mnt/D/work_documents/workspace_ide_linux/HibernateTools/src/java/org/hibernate/tool/Version.java
自己的修改hibernate-tools的模板和修复Comment乱码问题:http://kennylee26.iteye.com/blog/1229993
Hibernate Tools生成注释:http://www.blogjava.net/pauliz/archive/2009/11/13/302162.html
修改源码的地方:
输出中文乱码:
1.
TemplateProducer.produce(), 应该使用UTF-8输出到文件.
Writer fileWriter = null;
....
fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destination), "UTF-8"));
2.src/org/hibernate/tool/hbm2x/jtidy.properties
input-encoding=utf-8
output-encoding=utf-8
3.反转表名等类,都存放在:org.hibernate.cfg.reveng.dialect, 并针对相应类重载getTables方法.
DAO:
src/org/hibernate/tool/hbm2x/DAOExporter.java, 这里修改输出类的文件名,extends,implements等.
dao/daohome.ftl, 这里可以修改默认的方法,和类名字等.
POJO:
src/org/hibernate/tool/hbm2x/POJOExporter.java, 这里修改输出类的extends,implements等.
pojo/Pojo.ftl
去掉注解的schema,catlog, Ejb3TypeDeclaration.ftl,Line8,7
POJO的头部注释信息:生成表的注释:
A:修改或者重载JDBCMetaDataDialect的继续类的getTables()方法,确保这里的rs.getString("remarks")能得到数据库的注释,否则自己查找数据库得到注释.
B:src/pojo/PojoTypeDeclaration.ftl,增加表注释
${pojo.getClassJavaDoc(pojo.getDeclarationName() + " By Pandy.", 0)}
改为
<#if clazz.table.comment?exists>
/**
* Entity: ${clazz.table.comment}
*/
</#if>
extends:
BasicPOJOClass.getExtendsDeclaration(), Line190
EntityPOJOClass.getExtends(), 写入extends, 或者直接Line84固定返回extends
implements:
BasicPOJOClass.getImplementsDeclaration(), Line200
EntityPOJOClass.getImplements(), Line87
给POJO增加一些默认的函数:
src/pojo/Pojo.ftl, Line11,
增加serialVersionUID:
src/pojo/Pojo.ftl, Line7
private static final long serialVersionUID = 1L;
修改数据库语言:Dialect, 这里影响到pojo.id的注解
MetaDataDialectFactory.createMetaDataDialect();
这里没有正确从文件hibernate.properties获得dialect, 所以直接修改property=默认的dialect,
比如:String property ="org.hibernate.cfg.reveng.dialect.SQLServerMetaDataDialect";
SQLServerMetaDataDialect这个是在Hibernate-Tools.jar里面的.
http://tonydark01.iteye.com/blog/1721834
直接用junit或mian函数运行,而非依赖于jboss的插件,省的更新eclipse或者迁移的时候各种麻烦 ,副项目包备份.
1.增加slf4j-simple-1.5.2.jar,
2.增加驱动程序包,
3.给JDBCMetaDataConfiguration.java增加一个方法
4.给hibernate.cfg.xml增加一个属性
注意,貌似许多属性都是在这里增加的.
源码里面有一个很好的格式化类:org.hibernate.tool.hbm2x.XMLPrettyPrinter
调用
public void formatFiles() { formatXml( "xml" ); formatXml( "hbm.xml" ); formatXml( "cfg.xml" ); } private void formatXml(String type) throws ExporterException { List list = (List) files.get(type); if(list!=null && !list.isEmpty()) { for (Iterator iter = list.iterator(); iter.hasNext();) { File xmlFile = (File) iter.next(); try { XMLPrettyPrinter.prettyPrintFile(XMLPrettyPrinter.getDefaultTidy(), xmlFile, xmlFile, true); } catch (IOException e) { throw new ExporterException("Could not format XML file: " + xmlFile,e); } } } }
获得源码的方法:
https://github.com/hibernate/hibernate-tools, 然后建立maven工程
得到源码后需要处理的问题:
1.修改pom.xml的name等信息,来适合自己建立的工程。
2.注释掉pom.xml一些没必要的数据库信息。
3.注释几个地方
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.8</version> <!--<scope>test</scope>--> </dependency>
4.加入sql server driver,先执行mavn
mvn install:install-file -Dfile=/mnt/D/work_documents/jar2mvn/sqljdbc-4.0.jar -DgroupId=sqljdbc -DartifactId=sqljdbc -Dversion=4.0 -Dpackaging=jar
再加入依赖:
<dependency> <groupId>sqljdbc</groupId> <artifactId>sqljdbc</artifactId> <version>4.0</version> </dependency>
5. 加入
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/config/hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 连接数据库信息 --> <property name="hibernate.bytecode.use_reflection_optimizer">false</property> <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <property name="hibernate.connection.password">sa</property> <property name="hibernate.connection.url">jdbc:sqlserver://192.168.0.196:1433;databaseName=dev_cpm</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property> <property name="hibernate.search.autoregister_listeners">false</property> <!-- 代码生成信息 info --> <!--<property name="hibernatetool.metadatadialect">org.hibernate.cfg.reveng.dialect.SQLServer2008MetaDataDialect</property>--> <property name="hibernatetool.metadatadialect">org.hibernate.cfg.reveng.dialect.SQLServerMetaDataDialect</property> <!-- 自定义信息 --> <property name="custom.package">com</property> <property name="custom.one2many">false</property> <property name="custom.many2one">true</property> <property name="custom.many2many">true</property> <property name="custom.detectOptimisticLock">true</property> <!-- 要遍历的数据库,这个是必需写正确,否在找不到表 --> <property name="custom.catlog">dev_cpm</property> <property name="custom.schema">dbo</property> <property name="custom.isAnnotation">true</property> <property name="custom.genPojo">true</property> <property name="custom.genDao">true</property> <property name="custom.outputDir">/mnt/D/work_documents/workspace_ide/HibernateTools/codes</property> </session-factory> </hibernate-configuration>
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/com/pandy/RunHibernateTools.java
package com.pandy; import java.io.File; import java.util.Properties; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.JDBCMetaDataConfiguration; import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; import org.hibernate.cfg.reveng.ReverseEngineeringSettings; import org.hibernate.tool.hbm2x.DAOExporter; import org.hibernate.tool.hbm2x.DAONewExporter; import org.hibernate.tool.hbm2x.POJOExporter; public class RunHibernateTools { public void run() { String path = getClass().getResource("/").toString(); if (path.startsWith("file:")) path = path.substring("file:".length() + 1); //String fileName = path + "config/hibernate.cfg.xml"; String fileName = "/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/config/hibernate.cfg.xml"; File file = new File(fileName); if (!file.exists()) { throw new RuntimeException("找不到配置文件"); } // 直接给绝对路径会出问题 Configuration xmlcfg = new Configuration().configure(file); JDBCMetaDataConfiguration cfg = new JDBCMetaDataConfiguration(); Properties properties = xmlcfg.getProperties(); cfg.setProperties(properties); DefaultReverseEngineeringStrategy configurableNamingStrategy = new DefaultReverseEngineeringStrategy(); configurableNamingStrategy.setSettings(new ReverseEngineeringSettings(configurableNamingStrategy) .setDefaultPackageName(getString(properties, "custom.package", "com"))// 要生成的包名 .setCreateCollectionForForeignKey(getBoolean(properties, "custom.one2many", false))// 是否生成many-to-one的在one端的集合类, // 就是一对多的关系 .setCreateManyToOneForForeignKey(getBoolean(properties, "custom.many2one", true))// 是否生成many-to-one .setDetectManyToMany(getBoolean(properties, "custom.many2many", true))// 是否生成many-to-many .setDetectOptimisticLock(getBoolean(properties, "custom.detectOptimisticLock", true)) // 乐观锁对象? ); cfg.setReverseEngineeringStrategy(configurableNamingStrategy); //cfg.readFromJDBC();// 不区分schema和catlog的话,容易碰到错误. cfg.readFromJDBC(getString(properties, "custom.catlog", "Test"), getString(properties, "custom.schema", "dbo"));// 只从数据的这些信息生成 cfg.buildMappings(); if (getBoolean(properties, "custom.genPojo", true)) { POJOExporter exporter = new POJOExporter(cfg, getOutputDir(properties)); if (getBoolean(properties, "custom.isAnnotation", true)) { exporter.getProperties().setProperty("ejb3", "true");// ejb3注解 exporter.getProperties().setProperty("jdk5", "true");// jdk5语法(主要是集合类的泛型处理) } exporter.start(); } if (getBoolean(properties, "custom.genDao", false)) { DAOExporter daoExporter = new DAOExporter(cfg, getOutputDir(properties)); daoExporter.start(); } } private File getOutputDir(Properties properties) { File file = new File(getString(properties, "custom.outputDir", "/"));// 生成项目的物理位置(跟目录,tools会自动根据pacakge建立相应路径) return file; } private static boolean getBoolean(Properties properties, String key, boolean defaultValue) { String val = properties.getProperty(key); if (isBlank(val)) { return defaultValue; } return Boolean.valueOf(val); } private static String getString(Properties properties, String key, String defaultValue) { String val = properties.getProperty(key); if (isBlank(val)) { return defaultValue; } return val; } private static Integer getInteger(Properties properties, String key, Integer defaultValue) { String val = properties.getProperty(key); if (isBlank(val)) { return defaultValue; } return Integer.parseInt(val); } private static boolean isBlank(String val) { if (val == null || val.trim().length() == 0) return true; return false; } public static void main(String[] args) { System.out.println("----------------代码生成开始-----------------------"); RunHibernateTools tools = new RunHibernateTools(); tools.run(); System.out.println("----------------代码生成完成-----------------------"); } }
可能要适当修改
6.增加一个存放代码的文件夹
/mnt/D/work_documents/workspace_ide/HibernateTools/codes
7. /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java 增加一个方法:
public void readFromJDBC(String catalog, String schema) { JDBCBinder binder = new JDBCBinder(this, buildSettings(), createMappings(), revEngStrategy); binder.readFromDatabase(catalog, schema, buildMapping(this)); }
mian方法修改:
//cfg.readFromJDBC();// 不区分schema和catlog的话,容易碰到错误. cfg.readFromJDBC(getString(properties, "custom.catlog", "Test"), getString(properties, "custom.schema", "dbo"));// 只从数据的这些信息生成
8.生成的DAO后缀是Home,要是改成XxxxDAO,以DAO为后缀。
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/DAOExporter.java, 修改以下方法为:
protected void init() { super.init(); setTemplateName(DAO_DAOHOME_FTL); setFilePattern("{package-name}/{class-name}DAO.java"); }
9.模板文件,如果生成的代码需要修改,可以修改模板,路径为
/mnt/D/work_documents/workspace_ide/HibernateTools/src/templates
10. 配置需要生成代码的表
A: 跟踪代码
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java
前面有一段static代码,里面有 ge.getConfiguration().getClassMappings(),ge.getConfiguration()里面有一个tables属性,映射了table=>java file.
B:到/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/AbstractExporter.java 去查看这个configuration到底怎么初始化?
可以看到它的初始化是GenericExporter构造函数里面传入。那么就要找到什么时候创建GenericExporter?
C:
它是在POJOExporter构造函数里面,那么就在main函数的POJOExporter exporter = new POJOExporter(cfg, getOutputDir(properties));创建。
D:到main函数更在cfg的创建,并监视里面的tables什么时候有值?cfg.readFromJDBC()这里被赋值,继续跟踪。
D: 跟踪到/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCBinder.java,readFromDatabase()方法DatabaseCollector collector = readDatabaseSchema(catalog, schema),被赋值。
E: 让它继续找,我们只是在生成的时候过滤掉就可以了。那么回到A,在这里做手脚。
-----------
I: /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/config/hibernate.cfg.xml增加一个
<!-- 需要都好隔开表名 --> <property name="custom.filter.include">app_user,rh_log_exception_info,rh_log_exception_param</property>
II:/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java最后面增加
public String[] filterIncludeTables = null; public void setFilterIncludeTables(String[] filters) { this.filterIncludeTables = filters; for (int i = 0; i < filters.length; i++) { this.filterIncludeTables[i] = filters[i].replace("_", ""); } } public boolean isInclude(String shortName) { if(filterIncludeTables==null) return true; for (int i = 0; i < filterIncludeTables.length; i++) { if(shortName.equalsIgnoreCase(filterIncludeTables[i])) return true; } return false; }
III: /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java修改static段的代码:
static { modelIterators.put( "configuration", new ModelIterator() { void process(GenericExporter ge) { TemplateProducer producer = new TemplateProducer(ge.getTemplateHelper(),ge.getArtifactCollector()); producer.produce(new HashMap(), ge.getTemplateName(), new File(ge.getOutputDirectory(),ge.filePattern), ge.templateName, "Configuration"); } }); modelIterators.put("entity", new ModelIterator() { void process(GenericExporter ge) { Iterator iterator = ge.getCfg2JavaTool().getPOJOIterator(ge.getConfiguration().getClassMappings()); Map additionalContext = new HashMap(); while ( iterator.hasNext() ) { POJOClass element = (POJOClass) iterator.next(); JDBCMetaDataConfiguration cfg = (JDBCMetaDataConfiguration)ge.getConfiguration(); if(cfg.isInclude(element.getShortName())){ ge.exportPersistentClass( additionalContext, element ); } } } }); modelIterators.put("component", new ModelIterator() { void process(GenericExporter ge) { Map components = new HashMap(); Iterator iterator = ge.getCfg2JavaTool().getPOJOIterator(ge.getConfiguration().getClassMappings()); Map additionalContext = new HashMap(); while ( iterator.hasNext() ) { POJOClass element = (POJOClass) iterator.next(); ConfigurationNavigator.collectComponents(components, element); } iterator = components.values().iterator(); while ( iterator.hasNext() ) { Component component = (Component) iterator.next(); ComponentPOJOClass element = new ComponentPOJOClass(component,ge.getCfg2JavaTool()); JDBCMetaDataConfiguration cfg = (JDBCMetaDataConfiguration)ge.getConfiguration(); if(cfg.isInclude(element.getShortName())){ ge.exportComponent( additionalContext, element ); } } } }); }
这样就搞定了。可以模仿做排除功能。
11.打包成jar, 参考:http://panyongzheng.iteye.com/blog/1759912,http://sundful.iteye.com/blog/1850070,修改pom.xml使用maven-compiler-plugin插件的java版本为1.7。 并修改插件的版本号http://qiang106.iteye.com/blog/1388645,
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <includes> <include>**/*.java</include> </includes> <source>1.7</source> <target>1.7</target> </configuration> </plugin> ...... ...... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors> <descriptor>./src/assembly/dist.xml</descriptor> </descriptors> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin>
命令为:
测试并打包:mvn -e clean package
不需要测试打包:mvn -e clean package -DskipTests
复制源码,不测试打包:mvn clean assembly:assembly -DskipTests
12.执行jar:
复制得到依赖jar: mvn dependency:copy-dependencies -DoutputDirectory=target/lib
执行不含源码jar:java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar
执行含源码的jar:java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1-jar-with-dependencies.jar
最后的打包并执行的两个命令:
mvn -e clean package dependency:copy-dependencies -DskipTests -DoutputDirectory=target/lib
java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar
13.执行是输入hibernate.cfg.xml文件路径
A:修改run方法,增加一个hibernate.cfg.xml的绝对路径参数,并注释掉原本硬编码路径:
B:修改mian方法:
public static boolean validate(String[] args){ if(args==null||args.length==0) { System.out.println("ERROR: 一定要输入一个参数,这个参数是hibernate.cfg.xml的绝对路径."); return false; } String filePath = args[0]; File file = new File(filePath); if(!file.exists()){ System.out.println("ERROR: hibernate.cfg.xml文件不存在."); return false; } return true; } public static void main(String[] args) { System.out.println("验证参数:"); if(!validate(args)){ System.exit(0); } System.out.println("----------------代码生成开始-----------------------"); RunHibernateTools tools = new RunHibernateTools(); tools.run(args[0]); System.out.println("----------------代码生成完成-----------------------"); }
最终执行命令: java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar /mnt/D/work_documents/workspace_ide/HibernateTools/hibernate.cfg.xml
14.POJO的源码主键生成
org.hibernate.tool.hbm2x.pojo.EntityPOJOClass, generateAnnIdGenerator()方法。因为不知道怎么传入主键的配置,所以尝试在这里修改。我改成了:要么是uuid,要么是auto类型,这个是自己的需求。
if ( !"native".equals( strategy ) ) { if ( "guid".equals( strategy )||"uuid".equals( strategy ) ) { //增加uuid的注解 builder.resetAnnotation( importType("javax.persistence.GeneratedValue") ); builder.addQuotedAttribute( "generator", "system-uuid" ); idResult.append(builder.getResult()); //增加一个注解 AnnotationBuilder builder1=AnnotationBuilder.createAnnotation( importType("org.hibernate.annotations.GenericGenerator") ) .addQuotedAttribute( "name", "system-uuid" ) .addQuotedAttribute( "strategy", "org.hibernate.id.UUIDGenerator"); idResult.append(builder1.getResult()); } else { /*builder.resetAnnotation( importType("javax.persistence.GeneratedValue") ); builder.addAttribute( "strategy", staticImport("javax.persistence.GenerationType", "IDENTITY" ) ); idResult.append(builder.getResult());*/ builder.resetAnnotation( importType("javax.persistence.GeneratedValue") ); //使用自动主键生成器 builder.addAttribute( "strategy", staticImport("javax.persistence.GenerationType", "GenerationType.AUTO" ) ); idResult.append(builder.getResult()); } }else { builder.resetAnnotation( importType("javax.persistence.GeneratedValue") ); idResult.append(builder.getResult()); }
修改源码默认产生equal,toString,hashCode方法:
/mnt/D/work_documents/workspace_ide_linux/HibernateTools/src/java/org/hibernate/tool/hbm2x/pojo/BasicPOJOClass.java
toString:
private boolean needsToString(Iterator iter) { /*while ( iter.hasNext() ) { Property element = (Property) iter.next(); if ( c2j.getMetaAsBool( element, "use-in-tostring" ) ) { return true; } } return false;*/ return true; }
private Iterator getToStringPropertiesIterator(Iterator iter) { List properties = new ArrayList(); while ( iter.hasNext() ) { Property element = (Property) iter.next(); //if ( c2j.getMetaAsBool( element, "use-in-tostring" ) ) { properties.add( element ); //} } return properties.iterator(); }
equal & hashCode:
private boolean needsEqualsHashCode(Iterator iter) { while ( iter.hasNext() ) { Property element = (Property) iter.next(); //if ( usePropertyInEquals( element ) ) { return true; //} } return false; } public String generateHashCode(Property property, String result, String thisName, boolean jdk5) { StringBuffer buf = new StringBuffer(); //if ( c2j.getMetaAsBool( property, "use-in-equals" ) ) { ...... 里面的不用注释 //} return buf.toString(); }
修改版本号信息:
/mnt/D/work_documents/workspace_ide_linux/HibernateTools/src/java/org/hibernate/tool/Version.java
自己的修改hibernate-tools的模板和修复Comment乱码问题:http://kennylee26.iteye.com/blog/1229993
Hibernate Tools生成注释:http://www.blogjava.net/pauliz/archive/2009/11/13/302162.html
修改源码的地方:
输出中文乱码:
1.
TemplateProducer.produce(), 应该使用UTF-8输出到文件.
Writer fileWriter = null;
....
fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destination), "UTF-8"));
2.src/org/hibernate/tool/hbm2x/jtidy.properties
input-encoding=utf-8
output-encoding=utf-8
3.反转表名等类,都存放在:org.hibernate.cfg.reveng.dialect, 并针对相应类重载getTables方法.
DAO:
src/org/hibernate/tool/hbm2x/DAOExporter.java, 这里修改输出类的文件名,extends,implements等.
dao/daohome.ftl, 这里可以修改默认的方法,和类名字等.
POJO:
src/org/hibernate/tool/hbm2x/POJOExporter.java, 这里修改输出类的extends,implements等.
pojo/Pojo.ftl
去掉注解的schema,catlog, Ejb3TypeDeclaration.ftl,Line8,7
POJO的头部注释信息:生成表的注释:
A:修改或者重载JDBCMetaDataDialect的继续类的getTables()方法,确保这里的rs.getString("remarks")能得到数据库的注释,否则自己查找数据库得到注释.
B:src/pojo/PojoTypeDeclaration.ftl,增加表注释
${pojo.getClassJavaDoc(pojo.getDeclarationName() + " By Pandy.", 0)}
改为
<#if clazz.table.comment?exists>
/**
* Entity: ${clazz.table.comment}
*/
</#if>
extends:
BasicPOJOClass.getExtendsDeclaration(), Line190
EntityPOJOClass.getExtends(), 写入extends, 或者直接Line84固定返回extends
implements:
BasicPOJOClass.getImplementsDeclaration(), Line200
EntityPOJOClass.getImplements(), Line87
给POJO增加一些默认的函数:
src/pojo/Pojo.ftl, Line11,
增加serialVersionUID:
src/pojo/Pojo.ftl, Line7
private static final long serialVersionUID = 1L;
修改数据库语言:Dialect, 这里影响到pojo.id的注解
MetaDataDialectFactory.createMetaDataDialect();
这里没有正确从文件hibernate.properties获得dialect, 所以直接修改property=默认的dialect,
比如:String property ="org.hibernate.cfg.reveng.dialect.SQLServerMetaDataDialect";
SQLServerMetaDataDialect这个是在Hibernate-Tools.jar里面的.
http://tonydark01.iteye.com/blog/1721834
直接用junit或mian函数运行,而非依赖于jboss的插件,省的更新eclipse或者迁移的时候各种麻烦 ,副项目包备份.
1.增加slf4j-simple-1.5.2.jar,
2.增加驱动程序包,
3.给JDBCMetaDataConfiguration.java增加一个方法
public void readFromJDBC(String catalog, String schema) { JDBCBinder binder = new JDBCBinder(this, buildSettings(), createMappings(), revEngStrategy); binder.readFromDatabase(catalog, schema, buildMapping(this)); }
4.给hibernate.cfg.xml增加一个属性
<property name="hibernatetool.metadatadialect">org.hibernate.cfg.reveng.dialect.SQLServer2008MetaDataDialect</property>,
注意,貌似许多属性都是在这里增加的.
发表评论
-
FFmpeg常用基本命令
2016-07-15 11:52 0http://www.cnblogs.com/dwdxdy/p ... -
iF.SVNAdmin安装
2016-06-27 17:13 1452http://blog.linhere.com/archive ... -
apache调优
2016-05-21 10:10 1168http://my.oschina.net/renqingsh ... -
tomcat命令
2016-04-28 09:56 974./startup.sh : 启动tomcat ./shutd ... -
Shiro 基于注解和标签实现的授权认证过程
2016-04-25 13:24 5980将 Shiro 作为应用的权限 ... -
Byteman 3.0.5 发布,Java 字节码注入工具
2016-04-23 10:29 1801Byteman 3.0.5 发布,Java 字 ... -
安装Hadoop, Hbase, Phoenix
2016-04-22 09:22 1514http://my.oschina.net/jrrx/blog ... -
jenkins+ant+jmeter搭建持续集成的接口测试平台实例
2016-04-15 13:29 1613http://my.oschina.net/u/1425843 ... -
Dubbo 介绍
2016-04-14 10:26 1093官方 http://dubbo.io/ DUBBO是一个分布式 ... -
Hadoop 2.6.4分布式集群环境搭建
2016-04-13 11:45 786http://my.oschina.net/jackieyea ... -
nagios报警信息,发送到微信端
2016-03-23 22:59 1162http://www.oschina.net/code/sni ... -
Keepalived配置与使用
2016-03-23 22:53 1071原文: http://weizhifeng.net/using ... -
会话状态保持,JSESSIONID,COOKIE,URL重写
2016-03-17 20:26 1793http://my.oschina.net/sniperLi/ ... -
Intellij IDEA 根据数据库自动生成pojo和hbm
2016-03-13 17:03 2410http://my.oschina.net/jimyao/bl ... -
比较简洁的Hadoop介绍
2016-03-10 22:49 999http://www.cnblogs.com/sunddenl ... -
Intellij 配置Tomact 热部署
2016-01-28 11:19 949http://my.oschina.net/heweipo/b ... -
Java 应用发布后,需要关注的7个性能指标
2015-12-16 23:39 1160http://my.oschina.net/oneapmoff ... -
dom4j解析xml-取消doctype中DTD验证设置
2015-11-27 11:30 2274http://pengfeng.iteye.com/blog/ ... -
Linux下的压缩和解压
2015-11-10 16:13 1123Linux下的压缩(zip)解压(unzip)缩命令 http ... -
加密算法
2015-11-10 15:44 928http://my.oschina.net/u/2359500 ...
相关推荐
Hibernate Tools 是一个强大的开发工具,它为Hibernate ORM框架提供了丰富的集成开发环境支持,包括逆向工程(从数据库生成实体类)、代码生成、JPA支持以及HQL和SQL查询的调试等。要运行或修改Hibernate Tools的...
**Hibernate Tools使用指南** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了提升开发效率,Hibernate提供了一系列的工具,即Hibernate Tools,帮助开发者进行逆向...
2. 在弹出的窗口中,展开 "Hibernate" 目录,选择 "(cfg.xml)",指定配置文件保存的源代码目录。 3. 接下来,根据你的数据库设置填写相关信息,例如数据库类型、URL、用户名、密码和端口。这些信息将被用来生成 `...
总结来说,Hibernate Tools是Java开发中的得力助手,尤其对使用Hibernate框架的开发者而言,它的代码生成和数据库管理功能极大地提升了开发效率。通过正确安装和配置,开发者可以充分利用这个工具来简化日常开发工作...
11. **源码查看**:由于标签中有“源码”,这可能意味着在使用Hibernate Tools时,开发者会接触到并可能需要修改或理解相关的源代码,以便于定制或者优化工具的功能。 12. **工具的持续更新**:随着Hibernate框架的...
1. **Hibernate 逆向工程**: 逆向工程是将现有的数据库结构转化为 Hibernate 可识别的配置文件(如 .hbm.xml)和 Java 源代码(如实体类)的过程。这使得开发者可以直接操作数据库对象,而无需手动编写大量的数据...
源代码揭示了它们之间的接口调用关系,如如何通过Hibernate API获取数据库元数据,以及如何使用Hibernate的Annotation Processor在编译时进行ORM验证。这对于我们深入理解Hibernate的工作原理和优化ORM配置提供了...
Hibernatetools_Reference_Guide 是一个详细的文档,旨在介绍 Hibernate Tools 的各种特性和使用方法。此指南覆盖了从下载安装到具体功能使用的各个方面,是开发人员利用 Hibernate Tools 进行数据库操作时的重要...
6. **注解配置**:默认情况下,Hibernate Tools会生成使用Hibernate XML配置的Bean。如果你想使用注解配置,可以再次进行逆向工程,选择生成注解风格的Entity Bean。注解配置更简洁,更易于维护,但也需要确保你的...
标签“源码”和“工具”提示我们问题可能涉及到源代码的编写和使用的工具。在处理这类问题时,了解相关工具的配置选项以及源代码的处理流程至关重要。例如,Hibernate Tools的配置参数,或者源码中涉及编码转换的...
在逆向工程向导中,你需要指定`hibernate.cfg.xml`配置文件,选择数据库连接,并指定生成的源代码位置。 4. **选择表进行逆向**:在向导的下一步,你可以选择要从数据库中逆向的表,可以全选或只选择部分。此外,还...
《使用Hibernate Tools高效生成代码详解》 在软件开发过程中,数据访问层的代码编写往往是一项繁琐的任务,尤其是在大型项目中,手动编写实体类、映射文件以及DAO接口和实现类等,不仅耗时且易出错。这时,利用...
- 设置输出目录为项目源代码的“src”目录,并勾选“Reverse engineer from JDBC connection”。 - 输入存放Java类的包名,并设置Reverse engineer配置。 - 最后选择需要反向工程的表,完成配置。 #### 四、常见...
4. 源码兼容性:随着Java版本的升级,Hibernate-tools也在不断适配,确保与最新的JDK版本兼容,同时也考虑到了对老版本的支持,使得开发者可以根据项目需求灵活选择。 5. 性能优化:每次更新都会关注性能提升,例如...
4. **执行生成操作**:在IDE中使用Hibernate Tools的代码生成功能,选择对应的HBM文件,工具会根据文件中的映射信息自动生成对应的POJO类,包括属性、getter和setter方法,以及可能的构造函数。 5. **检查和修改**:...
- 设置“Output directory”为当前项目的源代码目录,通常是“src/main/java”。 - 勾选“Reverse engineer from JDBC Connection”,表示从数据库连接反向生成代码。 - 指定实体类(Bean)生成的包名,例如...