Hibernate(三)——框架中的关系映射

来源:互联网 发布:手机淘宝怎么评价宝贝 编辑:程序博客网 时间:2024/04/30 14:40

 在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系。而hibernate时间实体类和数据库中的表进行的映射,这些关系如何映射呢?这里简单总结一下:


          一,一对多,多对一关系映射,这里拿学生和班级进行简单演示:


             1,学生的类和对应的映射文件的编写:


[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. private int sid ;  
  2. private String sname ;  
  3.   
  4. private Classes classes ; //,引入班级对象,多对一  

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <class name="com.ljh.hibernate.pojo.Student" table="t_student" lazy="false">  
  2.     <id name="sid" column="sid">  
  3.         <generator class="native"/>  
  4.     </id>  
  5.     <property name="sname" column="sname" type="java.lang.String" length="20" not-null="true"/>         
  6.       
  7.     <!--   
  8.         表示对象的关系:多对一  
  9.         name 表示当前类的关系对象  
  10.         column 表示数据库中外键字段(也是描述数据关系)  
  11.         class 表示name属性值的类型  
  12.         cascade 级联  
  13.             主动方所做的操作(insert,update,delete),被动方也跟着做相同的操作。  
  14.             取值:save-update、delete 、all  
  15.             save-update : 保存或更新当前对象时,级联保存或更新关联对象  
  16.             delete : 删除当前对象时,级联删除关联对象  
  17.             all : 包含save,update,delete三种操作。  
  18.             对于多对一的场合,级联不能使用delete和all,否则会违背数据关系完整性。  
  19.         lazy : 延迟加载   
  20.             延迟初始化对象信息,等使用对象时再查询数据库。   
  21.             false : 禁用延迟加载  
  22.             proxy : 使用延迟加载(默认值),采用cglib代理完成延迟加载的扩展功能。  
  23.             no-proxy :  不使用代理,完成延迟加载 。可以使用第三方字节码增强工具。  
  24.         fetch : 数据抓取策略  :根据主动方,查询被动方时所采用的查询方式。    
  25.             fetch="select" 默认值,会采用多条语句的方式查找,往往会延迟加载数据  
  26.             fetch="join"  默认会采用左连接查询数据,不会延迟加载数据。  
  27.                 not-null 如果取值为true,那么框架采用内连接查询数据。  
  28.      -->  
  29.     <many-to-one name="classes" column="cid" cascade="save-update" lazy="no-proxy" fetch="join" not-null="true" class="com.ljh.hibernate.pojo.Classes"></many-to-one>  
  30. </class>  


             2,班级的实体类和对应的映射文件:


[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. private int cid ;  
  2. private String cname ;  
  3.   
  4. private Set<Student> studentSet = new HashSet<Student>(); //引入学生类的集合,一对多  

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <class name="com.ljh.hibernate.pojo.Classes" table="t_classes" >  
  2.     <id name="cid" column="cid">  
  3.         <generator class="native"/>  
  4.     </id>  
  5.     <property name="cname" column="cname" type="java.lang.String" length="20" not-null="true"/>     
  6.       
  7.     <!-- 声明   一对多映射  
  8.         lazy : 延迟加载  
  9.             false : 禁用延迟加载  
  10.             true : 延迟加载(默认值)  
  11.             extra : 支持延迟加载的。(推荐)  
  12.                 当获取集合自身信息时,可以发送高效的查询语句。  
  13.                 例如:只希望获取集合的长度,而不需要获取集合中数据的信息,框架会通过函数执行查询进行计算集合长度。。  
  14.       
  15.         fetch : 数据抓取策略  
  16.                 查询关联对象的数据时,所采用的查询方式。  
  17.             join : 通过一条连接语句进行立即查询。(延迟加载不起作用)  
  18.             select : 通过多条查询语句进行查询。  
  19.             subselect : 通过子查询语句进行立即查询。  (不推荐使用)(默认情况下和select取值结果相同)  
  20.           
  21.         not-null="true" 对于一对多的查询,即使设置了not-null语句,依然采用左连接查询。  
  22.           
  23.         Inverse="true",表示控制反转,由对方也就是学生方来进行管理外键。因为外键在学生    
  24.      -->  
  25.     <set name="studentSet" cascade="all" inverse="true" fetch="subselect">  
  26.         <key column="cid" not-null="true"></key>  
  27.         <one-to-many class="com.bjpowernode.hibernate.pojo.Student"/>  
  28.     </set>  
  29. </class>  

    二,自关联:就是在自己的类进行关联自己,例如父菜单与子菜单的关系,对应的实体类,和映射文件


[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. private int mid ;           private String name ;  
  2.           
  3.         private Set<Menu> menuSet = new HashSet<Menu>(); //父菜单与子菜单的关系为:一对多  
  4.           
  5.         private Menu pmenu ; //子菜单和父菜单的关系为:多对一  

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <class name="com.ljh.hibernate.pojo.Menu" table="t_menu" >  
  2.     <id name="mid" column="mid">  
  3.         <generator class="native"/>  
  4.     </id>  
  5.     <property name="name" column="name" type="java.lang.String" length="20" not-null="true"/>   
  6.       
  7.     <many-to-one name="pmenu" column="m_id" cascade="save-update"></many-to-one>  
  8.       
  9.     <!--  
  10.         自关联表的设计:外键字段不能为非空。 
  11.      -->  
  12.     <set name="menuSet" cascade="all" inverse="true">  
  13.         <key column="m_id"></key>  
  14.         <one-to-many class="com.ljh.hibernate.pojo.Menu"/>  
  15.     </set>  
  16. </class>  

           三,一对一关系映射:

                   1,假如是主键一对一用来映射:也就是说被动方的主键是来自于主动方的主键,也可以将之称之为外键:

                类之间相互添加彼此的应用。

                映射文件中主动方,增加一对一标签:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <one-to-one name="userinfo" cascade="all" class="com.ljh.hibernate.pojo.UserInfo"></one-to-one>  
  2.   
  3.               被动方,主键又是外键,也添加一对一的映射标签:  
  4.     <id name="uid" column="uid">  
  5.         <generator class="foreign">  
  6.             <param name="property">user</param>  
  7.         </generator>  
  8.     </id>  
  9.       
  10.     <!--   
  11.         描述一对一关系关系映射  
  12.         constrained="true" : 表示强制要求一对一使用外键关联。增加外键约束。  
  13.      -->  
  14.     <one-to-one name="user" constrained="true"  class="com.ljh.hibernate.pojo.User"></one-to-one>  

                 2,使用外键约束,其实是多对一的特殊情况,例如学生对班级,

                     类添加彼此的应用。

                     映射文件中学生端主动端,添加外键进行约束,添加多对一标签,

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <!--   
  2.     unique : 唯一约束  
  3.       
  4.         如果外键含有unique约束,那么表示主动方和被动方的关系为一对一。  
  5.           
  6.         对于一对一映射来讲,可以设置级联关系为delete 和 all  
  7.           
  8.         根据主动方查询被动方关联数据,是支持延迟加载的。  
  9.  -->  
  10. <many-to-one name="classes" column="cid" unique="true" cascade="all" class="com.ljh.hibernate.pojo.Classes"></many-to-one>  
  11.   
  12.                班级端的映射文件:添加一对一的标签:  
  13. <one-to-one name="student" cascade="all" property-ref="classes" class="com.ljh.hibernate.pojo.Student"></one-to-one>  

           四,多对多的关系,例如学生对课程的对应,在数据库中会生成第三张表进行维护:

                   在各自的类中引入对方的set集合,表示多对多。

                   

学生端:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <set name="courseSet" table="t_student_course" cascade="save-update">  
  2.     <key column="sid"></key>  
  3.     <many-to-many class="com.ljh.hibernate.pojo.Course" column="cid"></many-to-many>  
  4.   
  5. ;/set>  

课程端:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <!--   
  2.     对于多对多来讲,级联只能设置cascade="save-update"是合理的  
  3.     inverse="true" 让集合一端去维护中间表数据。任意一端都可以。  
  4.  -->  
  5.   
  6. <set name="studentSet" table="t_student_course"  cascade="save-update"  inverse="true">  
  7.     <key column="cid"></key>  
  8.     <many-to-many class="com.ljh.hibernate.pojo.Student" column="sid"></many-to-many>  
  9. </set>  



               五,联合主键的映射,这种情况很少见,看一下如何吧,

               出现了这种联合键时,需要我们为其定义一个联合主键的类(实现Serializable接口),类中声明多个字段的属性,表示联合主键字段。

               在配置映射文件时,主键的配置利用联合主键的标签即可:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. composite-id name="id">              <key-property name="title"></key-property>  
  2.                 <key-property name="author"></key-property>  
  3.             </composite-id>     

             综上,为Hibernate中对数据库进行关联设置映射时的几个简单例子,主要是我们根据实际情况,掌握几个对应标签的使用,还有就是里边的属性的使用。像lazycascadefetch等等。注意观察其中的不同。这样进行了关联设置我们就可以很好的,根据类生成数据库,对数据库中的数据进行关联操作,更加合理化!
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 荣耀9锁屏密码忘记了怎么办 华为荣耀v9锁屏密码忘记了怎么办 荣耀手机密码忘了怎么办数字锁 华为畅享5忘了开机密码怎么办 华为p9连接热点忘了密码怎么办 苹果手机用联通卡信号不好怎么办 魅族手机充电口松了怎么办 华为手机刷机失败开不了机怎么办 华为刷机失败开不了机怎么办 银行卡信息被盗密码被改该怎么办 全民k歌手机话筒有杂音怎么办 手机刷机清除数据需要密码怎么办 oppo手机屏锁密码忘了怎么办 华为手机摔了一下开不了机怎么办 华为v9手机删除隐私空间了怎么办 华为荣耀畅玩5x卡顿怎么办 淘宝买家收到货后恶意退款怎么办 手机淘宝申请退款后不想退了怎么办 买房交首付时的收据发票掉了怎么办 苹果商城消费提示问题忘记了怎么办 psd文件超过2g不能存储怎么办 手机拍的照片做微信头像太大怎么办 上传的照片在等待中传不上去怎么办 淘宝购物车里的图片模糊怎么办 天猫超市一箱饮料少两瓶怎么办 网上卖一件代发顾客要退货怎么办 京东买东西卖家拒绝发货怎么办 淘宝不小心退款给买家了怎么办 不小心智能清理了淘宝物流怎么办 移动卡绑定了太多东西换联通怎么办 淘宝上卖出的东西快递弄丢了怎么办 京东第三方不确认收货怎么办? 天猫评价被判定为广告怎么办 天猫一个订单用卷分单退货怎么办 天猫对已付款成功后自动退款怎么办 拼多多新人红包减价卖家怎么办 魔力宝贝手机版注册人数已满怎么办 买家投诉虚假签收淘宝卖家该怎么办 手机淘宝商家老打骚扰电话怎么办 手机上查询详单忘记服务密码怎么办 淘宝上的东西买过就找不到了怎么办