基于XDoclet的Hibernate3企业级开发教程(1)——one2one映射类型的书写要点
摘要:此为我给公司内部新员工培训的实战演示例子,傻瓜级教程,讲述了开发中的注意要点和常见错误,目的主要是让他们适应企业级快速流水作业。由于是面对面讲解,所以没有详细的文档,现在简单整理如下,希望对入门者有帮助。
培训的目标:对下面的开发过程和模式快速理解和应用。基于我的UML架构-----〉Java POJOs代码------〉在pojos中做xdoclet标识-------〉基于ant生成*.hbm.xml文件(借助于eclipse可以自动化配置)------〉生成database schma和数据库sql语句。逐步可以让新员工过渡到java5的annotation来开发EJB3 .
基于主键的一对一关联映射
说明:下面是我们用到的例子,学生和自己学籍上的照片是一对一关系。下面是使用IBM RSA得到的一个模型,途中用的是两个用途,表示的意思比较泛,最佳表示应该是一条无方向的线段,两边各标上1,代表一对一关系。(现在时间比较紧,所以没来的急修改,这也是IBM反向工程的一个弱点,就好比目标是北京,但是现在目标指向了中国,不够精确,但是可以反映这个意思)
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 317.25pt; HEIGHT: 259.5pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg" o:title="Model1"><img height="346" alt="Model1.jpg" src="http://www.blogjava.net/images/blogjava_net/asktalk/images/Model1.jpg" width="423" border="0"></imagedata></shape>
下面是生成的数据库E-R图:
<shape id="_x0000_i1026" style="WIDTH: 276.75pt; HEIGHT: 84.75pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image002.jpg" o:title="one2one2主键映射-1"><img height="113" alt="one2one2主键映射-1.jpg" src="http://www.blogjava.net/images/blogjava_net/asktalk/images/one2one2%E4%B8%BB%E9%94%AE%E6%98%A0%E5%B0%84-1.jpg" width="369" border="0"></imagedata></shape>
问题:初学者总是对pojos对象中的字段和数据库中的字段做对比,对pojos对象中多出的propertity感到不解,其实这也是hibernate的关键所在,在那个表增加字段,增加外键,都是有规律的,也是完全符合数据库的规则的,详细看代码.
初学者应该注意点,需要自己进行实践的操作:
1,
/**
*@hibernate.classtable="image"schema="hibernate_tutorial"
*@authorAdministrator
*
*/
schema
对
mysql
数据库来说,是数据库名字,这点注意
2,
你可以在关联属性上都定义外键,你看一下最后那边的设置在数据库
sql
语句中体现了,那个没体现,我想你会有收获的。
3,
/**
*@hibernate.one-to-oneclass="com.javawebside.one2one.p1.Image"
*constrained="false"outer-join="true"cascade="all"
*@returnReturnstheimage.
*/
注意cascade
的设置,如果没有级联,那么你可以最后
save student,
或者
save image
,或者,两者都保存,你看一下数据库中实际存入的数据,你一定会对
cascade
有更加深入的认识。
Image
类
package
com.javawebside.one2one.p1;
importjava.sql.Blob;
/**
*@hibernate.classtable="image"schema="hibernate_tutorial"
*@authorAdministrator
*
*/
publicclassImage{
privateLongid;
privateStringname;
privateBlobvalue=null;
/**
*@linkassociation
*/
privateStudentstudent;
publicImage(){}
publicImage(Longid,Stringname,Blobvalue){
super();
this.id=id;
this.name=name;
this.value=value;
}
/**
*@hibernate.idcolumn="id"generator-class="foreign"
*@hibernate.generator-paramname="property"value="student"
*@returnReturnstheid.
*/
publicLonggetId(){
returnid;
}
/**
*@paramid
*Theidtoset.
*/
publicvoidsetId(Longid){
this.id=id;
}
/**
*@hibernate.propertycolumn="name"not-null="false"unique="false"
*@returnReturnsthename.
*/
publicStringgetName(){
returnname;
}
/**
*@paramname
*Thenametoset.
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@hibernate.propertycolumn="value"not-null="false"unique="false"
*@returnReturnsthevalue.
*/
publicBlobgetValue(){
returnvalue;
}
/**
*@paramvalue
*Thevaluetoset.
*/
publicvoidsetValue(Blobvalue){
this.value=value;
}
/**
*@hibernate.one-to-oneclass="com.javawebside.one2one.p1.Student"constrained="true"
*foreign-key="forein_key_name"
*@return
*/
publicStudentgetStudent(){
returnstudent;
}
publicvoidsetStudent(Studentstudent){
this.student=student;
}
}
Student
类
package
com.javawebside.one2one.p1;
/**
*
*@hibernate.classtable="student"schema="hibernate_tutorial"
*@authorAdministrator
*
*/
publicclassStudent{
privateLongid;
privateStringname;
privateStringintro;
privateImageimage;
publicStudent(){
}
publicStudent(Longid,Stringname,Stringintro,Imageimage){
super();
this.id=id;
this.name=name;
this.intro=intro;
this.image=image;
}
/**
*@hibernate.idcolumn="id"generator-class="native"
*@returnReturnstheid.
*/
publicLonggetId(){
returnid;
}
/**
*@paramid
*Theidtoset.
*/
publicvoidsetId(Longid){
this.id=id;
}
/**
*@hibernate.propertycolumn="intro"not-null="false"unique="false"
*@returnReturnstheintro.
*/
publicStringgetIntro(){
returnintro;
}
/**
*@paramintro
*Theintrotoset.
*/
publicvoidsetIntro(Stringintro){
this.intro=intro;
}
/**
*@hibernate.propertycolumn="name"not-null="false"unique="false"
*@returnReturnsthename.
*/
publicStringgetName(){
returnname;
}
/**
*@paramname
*Thenametoset.
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@hibernate.one-to-oneclass="com.javawebside.one2one.p1.Image"
*constrained="false"outer-join="true"cascade="all"
*@returnReturnstheimage.
*/
publicImagegetImage(){
returnimage;
}
/**
*@paramimage
*Theimagetoset.
*/
publicvoidsetImage(Imageimage){
this.image=image;
}
}
下面是实际的操作类
BusinessService
类用于增加和删除数据操作
package
com.javawebside.one2one.p1;
importjava.sql.Blob;
importorg.hibernate.*;
//importorg.hibernate.cfg.Configuration;
//importjava.util.*;
publicclassBusinessService{
privateSessionsession;
publicvoidsetSession(Sessionse){
session=se;
}
publicSessiongetSession(){
returnsession;
}
publicvoidsaveStudent(StudentStudent)throwsException{
Transactiontx=null;
try{
tx=session.beginTransaction();
session.save(Student);
tx.commit();
}catch(Exceptione){
if(tx!=null){
tx.rollback();
}
throwe;
}finally{
//Nomatterwhat,closethesession
session.close();
}
}
publicStudentloadStudent(Longid)throwsException{
Transactiontx=null;
try{
tx=session.beginTransaction();
StudentStudent=(Student)session.load(Student.class,id);
tx.commit();
returnStudent;
}catch(Exceptione){
if(tx!=null){
tx.rollback();
}
throwe;
}finally{
//Nomatterwhat,closethesession
session.close();
}
}
publicvoidprintStudent(StudentStudent)throwsException{
Imageimage=Student.getImage();
System.out.println("Imageof"+Student.getName()+"is:"
+image.getValue());
if(image.getStudent()==null)
System.out.println("CannotnaviagtefromImagetoStudent.");
}
publicvoidtest()throwsException{
Studentstudent=newStudent();
Imageimage=newImage();
image.setName("
王东照片
"
);
student.setName("Tom");
student.setIntro("
王东
"
);
image.setStudent(student);
student.setImage(image);
saveStudent(student);
//student=loadStudent(student.getId());
//printStudent(student);
}
publicstaticvoidmain(Stringargs[])throwsException{
BusinessServicebs=newBusinessService();
bs.setSession(HibernateSessionFactory.currentSession());
if(bs.getSession()==null)
System.out.println("Sessionisnull");
bs.test();
//bs.getSession().close();
}
}
hibernate
配置类
package
com.javawebside.one2one.p1;
importorg.hibernate.HibernateException;
importorg.hibernate.Session;
importorg.hibernate.cfg.Configuration;
/**
*ConfiguresandprovidesaccesstoHibernatesessions,tiedtothe
*currentthreadofexecution.FollowstheThreadLocalSession
*pattern,see{@linkhttp://hibernate.org/42.html}.
*/
publicclassHibernateSessionFactory{
/**
*Locationofhibernate.cfg.xmlfile.
*NOTICE:LocationshouldbeontheclasspathasHibernateuses
*#resourceAsStreamstylelookupforitsconfigurationfile.That
*isplacetheconfigfileinaJavapackage-thedefaultlocation
*isthedefaultJavapackage.<br><br>
*Examples:<br>
*<code>CONFIG_FILE_LOCATION="/hibernate.conf.xml".
*CONFIG_FILE_LOCATION="/com/foo/bar/myhiberstuff.conf.xml".</code>
*/
privatestaticStringCONFIG_FILE_LOCATION="com/javawebside/one2one/p1/hibernate.cfg.xml";
/**HoldsasingleinstanceofSession*/
privatestaticfinalThreadLocal<Session>threadLocal=newThreadLocal<Session>();
/**Thesingleinstanceofhibernateconfiguration*/
privatestaticfinalConfigurationcfg=newConfiguration();
/**ThesingleinstanceofhibernateSessionFactory*/
privatestaticorg.hibernate.SessionFactorysessionFactory;
/**
*ReturnstheThreadLocalSessioninstance.Lazyinitialize
*the<code>SessionFactory</code>ifneeded.
*
*@returnSession
*@throwsHibernateException
*/
publicstaticSessioncurrentSession()throwsHibernateException{
Sessionsession=(Session)threadLocal.get();
if(session==null||!session.isOpen()){
if(sessionFactory==null){
try{
cfg.configure(CONFIG_FILE_LOCATION);
sessionFactory=cfg.buildSessionFactory();
}catch(Exceptione){
System.err
.println("%%%%ErrorCreatingSessionFactory%%%%");
e.printStackTrace();
}
}
session=(sessionFactory!=null)?sessionFactory.openSession()
:null;
threadLocal.set(session);
}
returnsession;
}
/**
*Closethesinglehibernatesessioninstance.
*
*@throwsHibernateException
*/
publicstaticvoidcloseSession()throwsHibernateException{
Sessionsession=(Session)threadLocal.get();
threadLocal.set(null);
if(session!=null){
session.close();
}
}
/**
*Defaultconstructor.
*/
privateHibernateSessionFactory(){
}
}
分享到:
相关推荐
在IT行业中,尤其是在Java企业级应用开发领域,Hibernate是一个广泛使用的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库,而无需直接编写SQL语句。然而,手动编写Hibernate的映射文件(XML文件)...
在IT行业中,XDoclet和Hibernate是两个非常重要的工具,特别是在Java企业级开发中。XDoclet是一款基于JavaDoc的代码生成工具,它能够自动生成持久化层代码,极大地简化了开发过程。而Hibernate则是一个强大的对象...
Struts、Hibernate、Spring、XDoclet、Ant和Log4j是Java开发中常见的六个重要组件,它们在企业级应用开发中发挥着关键作用。这些技术的整合为开发者提供了高效、灵活和可维护的解决方案。 **Struts** 是一个基于MVC...
1. **XDoclet**:XDoclet是一款基于JavaDoc的代码生成工具,它可以自动从Java源代码中的注释生成各种元数据,如Java EE的部署描述符、Hibernate的映射文件等。通过使用XDoclet,开发者可以避免手动编写这些重复性的...
Spring框架提供了强大的依赖注入和AOP(面向切面编程)支持,与Hibernate结合可以简化企业级应用的开发流程。 ### 总结 《Hibernate开发指南》不仅是一本入门教程,更是一份宝贵的实战手册。通过跟随夏昕老师的...
总结来说,xdoclet是Java开发中的一个强大工具,尤其在处理企业级应用时,能够显著提升开发效率。通过学习并熟练掌握xdoclet,开发者能够更好地应对复杂的项目需求,减少手动编码的工作量,同时保证代码的质量和一致...
总之,XDoclet是Java开发中的一个强大工具,它通过扩展Javadoc的能力,帮助开发者更高效地管理和维护项目中的配置文件,尤其在大型企业级应用中,能够显著提高开发效率和代码质量。正确理解和使用XDoclet,对于提升...
例如,通过在Java类上添加`@ejb`和`@hibernate`标签,XDoclet可以自动生成对应的EJB组件和Hibernate的持久化映射文件,大大简化了企业级应用的开发工作。 **定制与扩展**: 用户还可以自定义XDoclet标签,以适应...
标题中的"ant+hibernate+xdoclet"是一个经典的Java开发框架组合,用于高效地构建企业级应用的持久层。Ant是Apache软件基金会的一个开源项目,是一个强大的构建工具,能够自动化构建过程,如编译、打包和测试。...
总结,XDoclet-plugins-1.0.3是XDoclet的一个插件集合,它提供了一系列工具来自动化Java企业级应用的配置文件生成。这些插件涵盖了EJB、Hibernate、JMS、Web服务等多个领域,极大地简化了开发流程,提升了开发效率。...
这大大简化了EJB的开发流程,使得开发者能够快速创建和部署企业级服务。 - **Hibernate支持**:对于ORM框架Hibernate,XDoclet能够自动生成实体类、映射文件(hbm.xml)以及DAO层的接口和实现。这样,开发者只...
**XDoclet 插件1.0.3详解** XDoclet 是一款强大的Java文档生成器,它能够从源代码中的特定注释自动生成各种元数据,如JavaBeans、...如果你正在使用或计划使用Java进行企业级开发,XDoclet无疑是一个值得考虑的工具。
4. 其他插件:除了上述主要插件外,XDoclet还包含其他一些插件,用于处理Web服务、JMX等技术,进一步增强了其在企业级应用开发中的适用性。 在1.0.3这个版本中,开发者可能关注的改进和修复包括对新版本Java、框架...
《XDoclet In Action》这本书深入探讨了XDoclet这一强大的Java工具,它在软件开发领域,尤其是在企业级Java应用中扮演着重要角色。XDoclet是一款自动化代码生成工具,它能够通过解析Java源代码中的特定注解(Javadoc...
这对于减少重复的手动编写配置文件工作非常有帮助,尤其是在企业级应用开发中,如Enterprise JavaBeans (EJB) 和Hibernate对象关系映射(ORM)框架的配置。使用XDoclet,开发者可以将元数据直接写入源代码的注释中,...
1. "springside_reference.chm":可能是SpringSide项目的参考手册,SpringSide是一个基于Spring的轻量级Java开发框架,提供了最佳实践和工具,有助于快速开发企业级应用。 2. "appfuse.doc":这是一个关于AppFuse的...
1. **XDoclet与Hibernate映射:** XDoclet是一个注释处理器,可以自动生成Hibernate映射文件,提高开发效率。 2. **数据检索:** 包括使用Criteria API和HQL(Hibernate Query Language)进行复杂查询。 - Criteria...