[b]阅读对象:[/b]
有一些hibernate使用经验的开发人员;
[b]介绍:[/b]
在开发程序的时候,后台DAO基本的操作方法编写起来是繁琐冗余的工作。这里介绍一个Hibernate代码生成工具"HibernateSynchronizer"它是一个eclipse插件,主要功能就是帮助我们生成hbm、entity、dao代码。使用代码生成工具的好处是:提高开发效率、代码规范性更强、免除手工编写出现的手误BUG。
[b]环境:[/b]
HibernateSynchronizer-3.1.9(下载见附件)
eclipse Indigo Service Release 2
maven3
[b]插件安装:[/b]
将附件中的HibernateSynchronizer-3.1.9.zip下载解压(下载见附件);然后将plugins下的com.hudson.hibernatesynchronizer_3.1.9目录copy到${eclipse_home}\dropins目录下;重启eclipse成功后,点击window->prefrences输入hibernate,看到该插件表示安装成功。
[b]使用方法:[/b]
1、准备操作
确保已经创建了数据库和表。
2、创建hibernate配置文件
在指定的目录上右键:new->hibernate->hibernate Configuration file,弹出的对话框将让你填写你的jdbc驱动、URL、username、password等属性。
3、生成hibernate映射文件
在指定的目录上右键:new->hibernate->hibernate mapping file,弹出的对话框将让你填写你的jdbc驱动、URL、username、password等属性。输入完成后在tables右边点击refresh按钮(你也可以通过表名称过了如USER_%,表示以USER_开头的所有表),勾上相应表然后点击finish就会在指定目录创建hbm文件,同时还会询问你java代码存放目录指定一个即可。
4、生成DAO代码
在你创建的hbm文件中找到<meta attribute="sync-DAO">true</meta>默认是false改成true保存,就会生成DAO代码。如下图:
[img]http://dl2.iteye.com/upload/attachment/0096/7333/40d28bc1-e8c5-330a-92f4-9480ecc0f1e2.jpg[/img]
[b]测试代码:[/b]
[b]结果:[/b]
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
size===========>0
sesion已经关闭
[b]错误调试:[/b]
1、默认生成的hbm文件把表主键也生成为property,如果不修改就会报错:
[quote]
Exception in thread "main" org.hibernate.InvalidMappingException: Unable to read XML
at org.hibernate.util.xml.MappingReader.readMappingDocument(MappingReader.java:101)
at org.hibernate.cfg.Configuration.add(Configuration.java:513)
at org.hibernate.cfg.Configuration.add(Configuration.java:509)
at org.hibernate.cfg.Configuration.add(Configuration.java:716)
at org.hibernate.cfg.Configuration.addResource(Configuration.java:801)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2344)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2310)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2290)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2243)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2158)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2137)
at org.qhy.test.Test.main(Test.java:16)
Caused by: org.xml.sax.SAXParseException: The content of element type "class" must match "(meta*,subselect?,cache?,synchronize*,comment?,tuplizer*,(id|composite-id),discriminator?,natural-id?,(version|timestamp)?,(property|many-to-one|one-to-one|component|dynamic-component|properties|any|map|set|list|bag|idbag|array|primitive-array)*,((join*,subclass*)|joined-subclass*|union-subclass*),loader?,sql-insert?,sql-update?,sql-delete?,filter*,fetch-profile*,resultset*,(query|sql-query)*)".
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(XMLDTDValidator.java:2017)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(XMLDTDValidator.java:901)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:465)
at org.hibernate.util.xml.MappingReader.readMappingDocument(MappingReader.java:75)
... 11 more
[/quote]
这个错误的修改办法是将表主键的property标签改为id。
有一些hibernate使用经验的开发人员;
[b]介绍:[/b]
在开发程序的时候,后台DAO基本的操作方法编写起来是繁琐冗余的工作。这里介绍一个Hibernate代码生成工具"HibernateSynchronizer"它是一个eclipse插件,主要功能就是帮助我们生成hbm、entity、dao代码。使用代码生成工具的好处是:提高开发效率、代码规范性更强、免除手工编写出现的手误BUG。
[b]环境:[/b]
HibernateSynchronizer-3.1.9(下载见附件)
eclipse Indigo Service Release 2
maven3
[b]插件安装:[/b]
将附件中的HibernateSynchronizer-3.1.9.zip下载解压(下载见附件);然后将plugins下的com.hudson.hibernatesynchronizer_3.1.9目录copy到${eclipse_home}\dropins目录下;重启eclipse成功后,点击window->prefrences输入hibernate,看到该插件表示安装成功。
[b]使用方法:[/b]
1、准备操作
确保已经创建了数据库和表。
2、创建hibernate配置文件
在指定的目录上右键:new->hibernate->hibernate Configuration file,弹出的对话框将让你填写你的jdbc驱动、URL、username、password等属性。
3、生成hibernate映射文件
在指定的目录上右键:new->hibernate->hibernate mapping file,弹出的对话框将让你填写你的jdbc驱动、URL、username、password等属性。输入完成后在tables右边点击refresh按钮(你也可以通过表名称过了如USER_%,表示以USER_开头的所有表),勾上相应表然后点击finish就会在指定目录创建hbm文件,同时还会询问你java代码存放目录指定一个即可。
4、生成DAO代码
在你创建的hbm文件中找到<meta attribute="sync-DAO">true</meta>默认是false改成true保存,就会生成DAO代码。如下图:
[img]http://dl2.iteye.com/upload/attachment/0096/7333/40d28bc1-e8c5-330a-92f4-9480ecc0f1e2.jpg[/img]
[b]测试代码:[/b]
Configuration cfg = new Configuration();
SessionFactory sf = cfg.configure().buildSessionFactory();
Session session = sf.openSession();
//自动生成的DAO类
DamApplicationInfoDAO dao = new DamApplicationInfoDAO(session);
List<DamApplicationInfo> list = dao.findAll();
System.out.println("size===========>"+list.size());
if(session.isOpen()){
System.out.println("关闭sesion");
session.close();
}else{
System.out.println("sesion已经关闭");
}
sf.close();
[b]结果:[/b]
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
size===========>0
sesion已经关闭
[b]错误调试:[/b]
1、默认生成的hbm文件把表主键也生成为property,如果不修改就会报错:
[quote]
Exception in thread "main" org.hibernate.InvalidMappingException: Unable to read XML
at org.hibernate.util.xml.MappingReader.readMappingDocument(MappingReader.java:101)
at org.hibernate.cfg.Configuration.add(Configuration.java:513)
at org.hibernate.cfg.Configuration.add(Configuration.java:509)
at org.hibernate.cfg.Configuration.add(Configuration.java:716)
at org.hibernate.cfg.Configuration.addResource(Configuration.java:801)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2344)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2310)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2290)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2243)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2158)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2137)
at org.qhy.test.Test.main(Test.java:16)
Caused by: org.xml.sax.SAXParseException: The content of element type "class" must match "(meta*,subselect?,cache?,synchronize*,comment?,tuplizer*,(id|composite-id),discriminator?,natural-id?,(version|timestamp)?,(property|many-to-one|one-to-one|component|dynamic-component|properties|any|map|set|list|bag|idbag|array|primitive-array)*,((join*,subclass*)|joined-subclass*|union-subclass*),loader?,sql-insert?,sql-update?,sql-delete?,filter*,fetch-profile*,resultset*,(query|sql-query)*)".
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(XMLDTDValidator.java:2017)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(XMLDTDValidator.java:901)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:465)
at org.hibernate.util.xml.MappingReader.readMappingDocument(MappingReader.java:75)
... 11 more
[/quote]
这个错误的修改办法是将表主键的property标签改为id。