关联关系映射_第1页
关联关系映射_第2页
关联关系映射_第3页
关联关系映射_第4页
关联关系映射_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate高级应用( 视频讲解:107分钟)目前,持久层框架并非只有Hibernate,但在众多持久层框架中,Hibernate凭借着其强大的功能、轻量级的实现、成熟的结构体系等诸多优点从中脱颖而出,在Java编程中得到了广泛的应用。本章将在第14章的基础上,对其进行更加深入的讲解。通过阅读本章,您可以::掌握实体对象关系的建立:掌握关联关系的映射方法:理解单向关联与双向关联:掌握对象间的级联操作:掌握继承映射:掌握HQL查询语言15.1关联关系映射视频讲解:光盘\TM\Video\15\关联关系映射.exeHibernate框架是一个ORM框架,它以面向对象的编程方式操作数据库。在Hibernate中,“映射”发挥着巨大的作用,它将实体对象映射成数据表,实体对象的属性被映射为表中的字段,同样其实体之间的关联关系也是通过“映射”实现的。15.1.1单向关联与双向关联在Hibernate框架中,实体对象之间的关系可分为一对一、多对一等关联关系,其关联类型主要分为“单向关联”与“双向关联”。(1) 单向关联单向关联指具有关联关系的实体对象之间的加载关系是单向的。它意味着,在具有关联关系的两个实体对象中,只有一个实体对象可以访问对方。如图15.1所示,从学生对象中可以加载到班级信息,反过来则不行。(2) 双向关联

双向关联指具有关联关系的实体对象之间的加载关系是双向的。它意味着,在具有关联关系的两个实体对象中,彼此都可以访问对方。如图15.2所示,从学生对象中可以加载到班级信息,从班级对象中也可加载到学生的信息。,学生 A现霸图15.1单向关联学生.■现取图15.2双向关联15.1.2多对一单向关联映射多对一单向关联映射十分常见,在学习其映射方法之前,首先来了解一下多对一单向关联的实体。如图15.3所示,图书对象(Book)与图书类别对象(Category)为多对一的关联关系,多本图书对应一个类别,在Book对象中拥有Category的引用,它可以加载到一本图书的所属类别,而在Category的一端却不能加载到图书信息。对于多对一单向关联映射,Hibernate会在多的一端加入外键与一的一端建立关联关系,其映射后的数据表如图15.4所示。图15.3多对一单向关联的实体对象图15.4映射后的数据表例15.01建立图书对象(Book)与图书类别对象(Category)的多对一关联关系,通过单向关联进行映射。其关键的映射代码如下:(实例位置:光盘\TM\Instances\15.01)<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"

"/hibernate-mapping-3.0.dtd"><hibernate-mappingpackage="com.lyq.model"><classname="Book"table="tb_book_manytoone1"><!--主键--><idname="id"><generatorclass="native"/></id><!--图书名称--><propertyname="name"not-null="true"length="200"/><!--作者--><propertyname="author"not-null="true"length="50"/><!--多对一关联映射--><many-to-onename="category"class="Category"><!--映射的字段--><columnname="categoryId"/></many-to-one></class></hibernate-mapping>Hibernate的多对一单向关联是使用<many-to-one>标签进行映射,此标签用在多的一端。其中,name属性用于指定持久化类中相对应的属性名,class属性指定与其关联的对象。此外还需要指定数据表中所映射的字段,它使用子标签<column>进行设置,〈column>标签的name属性用于一的一端的主键标识。创建ExportTables类,在main()方法中将数据表导出。其关键代码如下:publicstaticvoidmain(String[]args){//加载配置信息Configurationcfg=newConfiguration().configure();〃实例化SchemaExport对象SchemaExportexport=newSchemaExport(cfg);

〃导出数据表export.create(true,true);}运行此类,将在数据库中创建图书信息表与图书类别表。例15.02多对一单向关联映射中对象的加载,代码如下。(实例位置:光盘\TM\Instances\15.02)publicclassTest{publicstaticvoidmain(String[]args){Sessionsession=null; //声明Session对象try{〃获取Sessionsession=HibernateUtil.getSession();〃开启事务session.beginTransaction();〃查询图书对象Bookbook=(Book)session.get(Book.class,newInteger(1));System.out.println("图书名称:"+book.getName());System.out.println("图书类别:"+book.getCategory().getName());//提交事务session.getTransaction().commit();}catch(Exceptione){e.printStackTrace();〃出错将回滚事务session.getTransaction().rollback();}finally{//关闭Session对象HibernateUtil.closeSession(session);本实例中,Book对象持有Category对象的引用,从Book对象中可以得到Category对象的属性,实例运行结果如图15.5所示。图15.5图15.5实例运行结果15.1.3多对一双向关联映射双向关联的实体对象都持有对方的引用,在任何一端都能加载到对方的信息。多对一双向关联映射实质是在多对一单向关联的基础上,加入了一对多关联关系。下面仍以图书对象(Book)与图书类别对象(Category)为例,讲解多对一双向关联映射,其实体关系如图15.6所示。Eool-id. : intnaEe : Strinrauthor : String-ca.t : Catecor:图15.6多对一双向关联的实体对象对于图书类别对象Category,它拥有多个图书对象的引用,因此需要在Category对象中加入Set属性的图书集合books,对于其映射文件也通过集合的方式进行映射。例15.03建立图书对象(Book)与图书类别对象(Category)的多对一关联关系,通过双向关联进行映射,其中Book对象的映射文件与多对一单向关联中一致,并没有发生任何变化,而Category对象的映射文件通过<set>标签进行映射。代码如下:(实例位置:光盘\TM\Instances\15.03)<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"<hibernate-mappingpackage="com.lyq.model"><classname="Category"table="tb_Category_manytoone2"><!--主键--><idname="id"><generatorclass="native"/></id><!--类别名称--><propertyname="name"not-null="true"length="200"/><!--—对多映射--><setname="books"><keycolumn="categoryId"/><one-to-manyclass="Book"/></set></class></hibernate-mapping><set>标签用于映射集合类型的属性,其中name属性用于指定持久化类中的属性名称。此标签通过子标签<key>指定数据表中的关联字段,对于一对多关联映射通过<one-to-many>标签进行映射,其class属性用于指定相关联的对象。创建ExportTables类,在main()方法中将数据表导出。其关键代码如下:publicstaticvoidmain(String[]args){//加载配置信息Configurationcfg=newConfiguration().configure();〃实例化SchemaExport对象SchemaExportexport=newSchemaExport(cfg);〃导出数据表export.create(true,true);}运行此类,将在数据库中创建图书信息表与图书类别表。

例15.04多对一双向关联映射中对象的加载,代码如下:(实例位置:光盘\TM\Instances\15.04)publicclassTest{publicstaticvoidmain(String[]args){Sessionsession=null; //声明Session对象try{〃获取Sessionsession=HibernateUtil.getSession();〃开启事务session.beginTransaction();System.out.println("*********查询图书对象************");〃查询图书对象Bookbook1=(Book)session.get(Book.class,newInteger(1));System.out.println("图书名称:"+book1.getName());System.out.println("图书类别:"+book1.getCategory().getName());System.out.println("*********查询类别对象************");〃查询类别对象Categoryc=(Category)session.load(Category.class,newInteger⑴);System.out.println("类别名称:"+c.getName());Set<Book>books=c.getBooks(); 〃获取类别中的所有图书//通过迭代输出图书名称for(Iterator<Book>it=books.iterator();it.hasNext();){Bookbook2=(Book)it.next();System.out.println("图书名称:"+book2.getName());}//提交事务session.getTransaction().commit();

}catch(Exceptione){e.printStackTrace();〃出错将回滚事务session.getTransaction().rollback();}finally{//关闭Session对象HibernateUtil.closeSession(session);}}}由于配置了图书与类别之间的多对一双向关联映射,所以Book对象与Category对象都持有对方的引用。图书类别属于多对一中一的一端,在一个类别中拥有多本图书,Hibernate使用Set集合进行映射,因此当加载一个类别时,可以加载到类别中的所有图书。实例运行结果如图15.7所示。图15.7实例运行结果15.1.4一对一主键关联映射用户与身份证之间是一对一的关联关系,每一个用户对应一个身份证,同样每一个身份证也对应一个用户。在Hibernate中,可将一对一关联映射分为主键关联映射与外键关联映射。使用一对一主键关联映射时,其数据表的结构如图15.8所示。从图15.8可以看出,IdCard的主键参照了User的外键,它与User对象的主键是一一对应的关系。同样,Hibernate的一对一主键关联映射也分为单向与双向映射。下面以双向映射为例进行讲解,其实体间的关系如图15.9所示。

numvdrcharlSO)typfvarchsrOO)图15.8表关系numvdrcharlSO)typfvarchsrOO)图15.8表关系图15.9实体关系例15.05用户(User)对象与证件(IdCard)对象为一对一的关联关系,二者之间通过一对一主键关联映射。其中User的映射文件User.hbm.xml的关键代码如下:(实例位置:光盘\TM\Instances\15.05)<hibernate-mapping><classname="com.lyq.model.User"table="tb_user_onetoone_p"><!--主键id--><idname="id"><generatorclass="native"/></id><!--姓名--><propertyname="username"not-null="true"/><!--年龄--><propertyname="age"/><!--—对一映射--><one-to-onename="idCard"/></class></hibernate-mapping>IdCard对象的主键参照了User对象的外键,其映射文件IdCard.hbm.xml的关键代码如下。<hibernate-mapping><classname="com.lyq.model.IdCard"table="tb_idCard_onetoone_p">

<idname="id"><!--参考User的外键--><generatorclass="foreign"><paramname="property">user</param></generator></id><!--证件号--><propertyname="num"not-null="true"/><!--—对一映射--><one-to-onename="user"constrained="true"/></class></hibernate-mapping><one-to-one>标签用于建立一对一关联映射,其中name属性用于指定持久化类中的属性名称;constrained属性用于建立一个约束,它表明IdCard对象的主键参照了User的外键。IdCard的主键生成策略为foreign,此种方式通过<parm>标签配置主键的来源。创建ExportTables类,在main()方法中将数据表导出。其关键代码如下:publicstaticvoidmain(String[]args){//加载配置信息Configurationcfg=newConfiguration().configure();〃实例化SchemaExport对象SchemaExportexport=newSchemaExport(cfg);〃导出数据表export.create(true,true);}运行此类,将在数据库中创建用户表与证件表。

15.1.5一对一外键关联映射除一对一主键关联映射外,还有一对一外键关联映射。这种映射方式在其中一端加入一个外键指向另一端,其映射后形成的数据表如图15.10所示。U=«l-IXaixlM irri.t■•jiiclurIrrtixKsidirrlMint 淮Ttniflyav:hu*图15.10表关系从图15.10中可以看出,这种映射方式与多对一映射方式相似,如果能限制User对象中IdCard的唯一性,那么二者之间实质上就构成了一对一关联关系。例15.06用户(User)对象与证件(IdCard)对象为一对一的关联关系,在二者之间建立一对一外键关联映射。其中IdCard的映射文件IdCard.hbm.xml的关键代码如下:(实例位置:光盘\TM\Instances\15.06)<hibernate-mapping><classname="com.lyq.model.IdCard"table="tb_idCard_onetoone_f"><!--主键id--><idname="id"><generatorclass="native"/></id><!--证件号--><propertyname="num"not-null="true"/></class></hibernate-mapping>User对象的映射文件User.hbm.xml的关键代码如下:<hibernate-mapping><classname="com.lyq.model.User"table="tb_user_onetoone_f"><!--主键id--><idname="id"><generatorclass="native"/></id>

<propertyname="username"not-null="true"/><!--年龄--><propertyname="age"/><!--—对一映射--><many-to-onename="idCard"unique="true"/></class></hibernate-mapping>在IdCard对象的映射文件中,并没有发生太大的变化,它只不过进行了普通的映射。而User对象的映射文件中,使用了<many-to-one>标签进行了映射,此标签用于多对一映射,但其unique属性可以限制其关联的唯一性,从而构成了一对一唯一外键关联映射。创建ExportTables类,在main()方法中将数据表导出,运行此类,将在数据库中创建用户表与证件表。15.1.6多对多关联映射Hibernate的多对多关联映射与多对一及一对一等映射方式不同,它需要借助于第三张表进行实现。比如学生和课程之间是多对多的关系,一个学生可以选修多门课程,而一门课程又可以被多个学生选修。对于此种关系,Hibernate分别用两个实体的标识映射出第三张表,用此表来维护学生与课程之间的多对多关系,如图15.11所示。图15.11表关系由于对象之间存在的是多对多的关系,彼此都可以拥有对方的多个引用,因此在设计持久化类中加入Set集合。例15.07建立学生对象与课程对象双向多对多关联关系映射,其中学生的持久化类为Studento其关键代码如下。(实例位置:光盘\TM\Instances\15.07)publicclassStudent{

privateIntegerid; //IDprivateStringname; //姓名privateIntegerage; //年龄privateSet<Course>course;〃课程集合//省略getXXX()与setXXX()方法}课程的持久化类为Course,其关键代码如下:publicclassCourse{privateIntegerid; //IDprivateStringname; 〃课程名称privateSet<Student>students; 〃学生集合//省略getXXX()与setXXX()方法}Student对象的映射文件为Student.hbm.xml,其关键代码如下。<hibernate-mappingpackage="com.lyq.model"><classname="Student"table="tb_student_manytomany"><!--主键id--><idname="id"><generatorclass="native"/></id><!--姓名--><propertyname="name"not-null="true"/><!--年龄--><propertyname="age"/><setname="course"table="tb_student_course"><keycolumn="studentId"></key><many-to-manyclass="Course"column="courseId"/></set>

</class></hibernate-mapping>Course对象的映射文件为Course.hbm.xml,其关键代码如下。<hibernate-mapping><classname="com.lyq.model.Course"table="tb_course_manytomany"><!--主键id--><idname="id"><generatorclass="native"/></id><!--姓名--><propertyname="name"not-null="true"/><!--多对多映射--><setname="students"table="tb_student_course"><keycolumn="courseId"/><many-to-manyclass="com.lyq.model.Student"column="studentId"/></set></class></hibernate-mapping>多对多关联映射中,使用<set>标签进行集合的映射,其table属性用于指定所映射的第三张表,其子标签<key>指定第三张表所形成的字段,子标签<many-to-many>映射多对多的关联关系。<many-to-many>标签的class属性指定关联的对象,column指定所关联的字段。由于本实例中使用的是双向多对多关联关系映射,所以在课程对象Course与学生对象Student中都要通过<set>标签进行映射。创建ExportTables类,在main()方法中将数据表导出,运行此类,将在数据库中创建3张表。15.1.7级联操作在关联中的使用

在数据库操作中,级联操作经常被用到,如级联更新、级联删除等操作。针对级联操作,Hibernate提供了相应的方法,它通过在映射文件中配置cascade属性来实现,其可选值有4种情况,如表15.1所示。表15.1cascade属性的可选值及说明可选值说明none默认值,不进行级联操作save-update当保存或更新当前对象时,级联保存或更新关联对象delete当删除当前对象时,级联删除关联对象all当保存、更新或删除当前对象时,级联保存、更新或删除关联对象例15.08图书对象B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论