零点起飞学Java Web开发之Hibernate的映射技巧_第1页
零点起飞学Java Web开发之Hibernate的映射技巧_第2页
零点起飞学Java Web开发之Hibernate的映射技巧_第3页
零点起飞学Java Web开发之Hibernate的映射技巧_第4页
零点起飞学Java Web开发之Hibernate的映射技巧_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

第15章使用Hibernate映射,建立JavaBean对象和数据库表之间的对应关系是Hibernate的核心内容,也是其精要之所在。掌握Hibernate的映射技巧对于JavaWeb开发者来说无疑是非常重要的。本章将结合实例对常用的映射逐一进行讲解。通过本章的学习,读者可以全面地掌握Hibernate建立对象到表之间映射的方法和技巧,并且可以为一般的数据库编写映射文件。,15.1配置映射文件,映射文件用来建立JavaBean对象到数据库表之间的对应关系。Hibernate是如何知道怎样去存储、加载JavaBean对象呢?这是由于映射文件告诉Hibernate应该去访问数据库中的哪一个表,以及表中的那些字段。要想使Hibernate正常工作,首先必须配置好映射文件,下面就对其进行讲解。,15.1.1映射文件的格式,映射文件是一个XML文件。在该文件中通过一些特定的标签去定义JavaBean到数据表之间的各种关系。:该标签用来指定映射文件的DTD,给出一个该文件的网址。一般来说,Hibernate在使用该网址前会查询CLASSPATH下面是否有DTD文件。如果有,直接使用该文件。:在标签和之间定义Hibernate的映射。可以通过标签去建立JavaBean实例和数据库表之间的映射。package属性用来指定映射文件中Java类的包名。这样在该映射文件中出现的所有类都不用单独指定完整路径。:在标签和之间定义一个JavaBean类到数据库表的映射。属性name用来指定JavaBean类的名字,table指定对应该JavaBean的数据库表。:该标签用来定义属性id和数据库主键的对应关系。name指定JavaBean的属性名,column属性默认和name属性的值相同。所以如果数据库表的对应字段和JavaBean的属性名相同,则可以将column省略。:该标签用来指定JavaBean属性和数据库表的字段之间的对应关系。如果没有指定column属性,则表示它与name属性的值相同。:该标签通过使用JavaBean的集合属性建立数据库表之间的对应关系。name代表JavaBean集合属性的名字,本章会详细讲述该标签。:该标签通过使用JavaBean的属性来建立多对一的关系。该属性为其他类的实例。:该标签用来建立一对一的关系,后面会有详述。,15.1.2装载映射文件,映射文件必须被Configuration加载才能正确使用。一般来说,有以下几种方法可以使Configuration加载映射文件。1在hibernate.cfg.xml中声明在该文件中通过声明。然后在程序中调用Configuration().configure()方法,Hibernate会去自动加载该映射文件。2Configuration的addResource()方法如果不在hibernate.cfg.xml中声明映射文件,也可以在程序中调用Configuration()的addResource()方法加载它。3Configuration的addClass()方法如果不采用以上两种方式,则可以调用Configuration的addClass()方法加载要建立映射的JavaBean类。,15.2映射一对多关联关系,一对多的关联关系是指一个实体对应多个其他的实体。例如,一个用户可以用多个订单,这种关系在JavaBean方面就体现为User类拥有一个属性orders,它是Order对象的集合;在数据库方面体现为user表的一条记录可以对应多条orders表的记录。如何让这两方面的关系联系起来呢?这就是Hibernate要做的事情,可以通过User的orders属性获得数据库表中所有对应该用户的订单。说明:一对多的实体关联关系在JavaBean方法中体现为单向关联和双向关联。例如,User类的orders属性指向多个Order类的实例,这叫做一对多单向关联。现在给Order类也创建一个属性Useruser=newUser(),它指向User类,叫做多对一单向关联。这两个单向关联同时存在,就变成了双向关联。下面先讲解多对一的单向关联。,15.2.1多对一单向关联,一个User实例对应多个Order实例,如果给Order类创建一个属性user,这样多个user属性对应一个User实例。在数据库方面order表有一个外键user_id,多个值相同的外键对应user表的一个主键。下面通过一个实例来讲解如何使用Hibernate建立这种映射关系。可以看出,测试类的main函数依次调用下面的函数。,1添加数据的addUserAndOrders()方法,该方法先创建一个User对象,然后创建3个Order对象,接着把它们都和User对象关联起来。最后持久化User和Order对象,,2级联保存数据的saveOrdersAndUserWithCascade()方法,该方法用来测试cascade属性。,3通过用户ID查询订单的findOrdersByUserId()方法,该方法通过外键user_id查询orders表,把user_id=user.getId()的所有orders表中的字段查询出来返回。,4打印所有订单信息的printOrders()方法,该方法把findOrdersByUserId()查询出来的所有Order对象打印出来。,15.2.2实现双向关联,Order的user属性可以关联到User类。现在给User类添加一个orders属性,它对应多个Oder实例,这样就实现了双向关联。通过标签建立User到Order一对多的关系,下面对各个标签进行解释。:该标签用来指定User的属性orders的类型为java.util.Set,这是一个集合类型。name:用来指定User类的属性名为orders。cascade:通过cascade=delete指定级联删除,如果删除一个User实例对应的记录,则级联删除其属性orders所对应的记录。:该标签表明orders表通过外键user_id参照user表。:表明orders属性存放的是一组Order对象。,15.3映射多对多关联关系,对于两个实体集合来说,多对多关联关系是指每个集合中的一个元素都对应另外一个集合的多个元素。例如,商品类别和商品就可以是多对多的关系,一种商品可以属于多个类别,一个类别可以包含多种商品。这种关系体现在JavaBean方面,可以是Category有集合属性products,它指向多个Product实例;体现在数据库方面,就是新建一个数据表category_product。它有两个外键:category_id、product_id,分别引用表category、product的主键。下面结合实例讲解如何使用Hibernate实现这种关联关系。说明:同一对多的关联关系一样,本节所讲的多对多关联关系也分为单向和双向两种,下面分别介绍。,15.3.1映射单向多对多关联,单向多对多关联关系只在Category或者Product类中建立集合属性,指向另一方。可以看出,粗体代码是给products属性建立的映射关系,下面对各个标签进行解释。:指定products属性的类型为Java.util.Set。table:该属性用来指定建立category和product多对多关联关系的数据表。cascade:cascade=save-update指定级联保存和更新products属性,当保存Category对象时,会把其属性products保存到数据表product中。:该标签表明category表通过category_product的外键category_id参照product表。:标签指定products的类型为Product。并且表明product表通过category_product的外键product_id参照category表。,15.3.2映射双向多对多关联,映射双向多对多关系,就需要在Product类中创建属性categories。它指向多个Category实例,仍然通过一个实例进行讲解。,15.4映射一对一关联关系,一对一关联关系是指一个实体唯一对应于另外一个实体。例如,在线购物系统要求每个用户都必须有一个账户,这样用户和账户之间就是一对一的关系。在JavaBean方面,要求User类有一个属性creditCardAccount,它指向CreditCardAccount的实例。同时CreditCardAccount类有一个属性user,它指向User的实例;在数据库方面要求表credit_card_account的主键id同时又是外键,它引用user表的主键id。标签:它用来指定credit_card_account的主键id,同时又是外键。并且它参照user属性,这样Hibernate就可以保证User和CreditCardAccount共享相同的Id值。标签:用来映射user属性,指定它的类型为User,constrained=true表明user属性被外键id所参照。Hibernate把user持久化后返回的id作为赋值给credit_card_account的外键id。,15.5映射继承关系,继承关系指的是JavaBean通过extends关键字建立的类与类之间的关系。关系数据库没有继承关系,所以映射继承关系就是要JavaBean的继承关系映射到关系数据库。本节讲解Hibernate的一种映射方案:只有继承关系的根类对应一张表。例如Person对应person表,在表中设置一个字段去标识每条记录对应User还是对应Adminuser。下面通过一个实例来讲解。说明:在编写JavaBean时可以把一些公用的属性、方法放在父类中。例如Adminuser和User类都有id

温馨提示

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

评论

0/150

提交评论