hibernate 映射复习

本文详细介绍了在ORM中如何实现一对一、一对多及多对多的关系映射,包括不同场景下的配置示例,如主键映射、外键映射、集合配置等。


一对一
********************************************************
A、主健映射:

都是one-to-one
要用foreign生成策略。
以汽车car和发动机Engine(一对一关系)为例:

a、主表Car.hbm.xml的写法
<class name="Car" table="car_pk">
    <id name="id" column="id" type="integer">
      <generator class="native" />
    </id>
    <property name="name" column="name" type="string" />
    <one-to-one name="engine" class="Engine" cascade="all"/>
  </class>
注:cascade="all" 表示增删改查Car对象时都会级联增加、删除和修
改Engine对象。
 
b、辅表Engine.hbm.xml的写法
<class name="Engine" table="engine_pk">
    <id name="id" column="id" type="integer">
      <generator class="foreign">
        <param name="property">car</param>
      </generator>
    </id>
    <property name="model" column="model" type="string" />
    <one-to-one name="car" class="Car" constrained="true"/>
  </class>
 
User类Address类
User为主类,Address为子类
两个类中所有的属性都要加上geter,setter方法
在User类中的setter中应该这样写是两个表关联起来:
public void setAddress(Address address) {
  this.address = address;
  address.setUser(this);
}
注:constrained="true"表示Engine应用了Car的主健作为外健
注意属性类型,不同的数据库属性所对应的数据类型不一样,Mysql 没有Long型,应该用Integer

B、唯一外健映射:

主表中用one-to-one,通过property-ref many-to-one
在主表中(User)
<one-to-one name="address" class="Address"    cascade="save-update"></one-to-one>
在附表中(Address)
<many-to-one name="user" class="User" unique="true" column="age"></many-to-one>    
********************************************************
一对多
********************************************************
编写User.hbm.xml,关联属性acts的配置如下:
 <set name="acts" cascade="all"     //<set name="acts">表示属性acts是一个Set集合
         inverse="true">    //inverse="true"表示由关系的另外一端
   <key column="fid"/>       //<key column="fid">表示关系另一端(多端,如Account表)的关联表中和本表相关的外键字段的名字是fid
   <one-to-many class="Account"/>  //表示该集合中保存的是持久对象,因此该集合属性acts(HashSet的名字)是一个代表一对多关系的"关联属性"
 </set>
      其中:
      ** <set name="acts">表示属性acts是一个Set集合
      ** <one-to-many>表示该集合中保存的是持久对象,因此该
          集合属性acts是一个代表一对多关系的"关联属性"
      ** class="Account"表示该集合中保存的持久对象的类型是Account
      ** <key column="fid">表示关系另一端(多端)
         的关联表中和本表相关的外键字段的名字是fid
      ** cascade="all"是级联操作的级别
      ** inverse="true"表示由关系的另外一端
         (多端)来维护关系,以提高效率
注: 在one一端的Set集合应该是HashSet集合
         Set<Account> accs=new HashSet();        
        在many端映射正常些
       <many-to-one name="user" column="accfid" cascade="save-update"></many-to-one>
       name="user":是对应User类型这个属性的名字
       column="accfid":many端外键的名字,与one端 <set 中的 <key 中的column的值一致
       one端的setter和getter方法不要少,另外再加上addXXX()方法。 

********************************************************
多对多
********************************************************  
在student.hbm.xml中的XML的编写:

     <!-- 
       table是中间表 ,
       key中的column表示中间表的一个字段course_id,
       course_id引用当前表的主键做外键
       many-to-many 表示当前表对应的多对多关系的表course,
       column 表示在中间表中的另一个外键,这个外键是引用course表的主键
     
-->
     
<set name="cours"  table="student_course" 
        cascade
="save-update" lazy="true">  
       
<key column="student_id"/> 
       
<many-to-many class="Course" column="course_id"></many-to-many> 
     
</set>  


在course.hbm.xml中的XML的编写:    

     <set name="stus"  table="student_course"
             cascade
="save-update" inverse="true" lazy="true">
             
<key column="course_id"/>
             
<many-to-many class="Student" column="student_id"></many-to-many>
     
</set> 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值