Hibernate学习笔记(3)---hibernate关联关系映射

一对一关联

假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系

1,通过主键关联(个人偏向另外一种)

User.hbm.xml文件配置
<id name="userid" type="java.lang.Integer">
            <column name="userid" />
            <!-- 主键关联,将主键生成策略改为foreign,表明由关联类来生成主键,
            	即直接使用另外关联类的主键值,该实体类不能生成主键 --> 
            <generator class="foreign" />
             <para name="property">address</para><!--  -->
        </id>       
        <property name="name" type="java.lang.String">
            <column name="name" length="12" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="16" />
        </property>
<one-to-one name="address" class="Address" constrained="true"></one-to-one></span>

  Addrss.hbm.xml文件配置

<id name="addressid" type="java.lang.Integer">  
            <column name="addressid" />  
            <generator class="identity" />  
        </id>         
        <property name="addressinfo" type="java.lang.String">  
            <column name="addressinfo" length="12" />  
        </property>

  

2通过外键关联

两张表主键不同,通过给一张表添加外键列来保持一对一关系,所以在user 表中加入address_id
直接在原始的User配置文件加入下行代码
 <!-- class属性:另外个实体类,将其的address属性映射为address表的外键address_id,  
        unique指定一对一映射  
         -->  
        <many-to-one name="address" class="Address" unique="true">  
        <!-- 外键 -->  
            <column name="address_id"></column>  
        </many-to-one>

  

一对多关联映射

还是上方例子为例,一个用户拥有多个地址
第一步:在一的一方表示出多(即在用户中表示多)
在User.java表示多,生成get,set方法
private Set<Address> setAddress = new HashSet<Address>();  
  
    public Set<Address> getSetAddress() {  
        return setAddress;  
    }  
    public void setSetAddress(Set<Address> setAddress) {  
        this.setAddress = setAddress;  
    }

  第二步:在Address.java表示一

  

private User user;  
public User getUser() {  
    return user;  
}  
public void setUser(User user) {  
    this.user = user;  
}  

  

第三步:配置Uesr.hbm.xml与Address.hbm.xml的基本映射
 
第四步:在一的配置文件(User.hbm.xml)配置多的一方
 <!--set集合名称 -->  
    <!--hibernate机制,双向维护外键       columen 外键名称-->  
     <key column="user_address"></key>  
     <one-to-many class="Address全路径"/>  
</set>

  第五步:在多的配置文件(Address.hbm.xml)配置一的一方

<!--name属性 写address.java表示的user-->  
    <many-to-one name="user" class="User全路径"  column="外键名"></many-to-one>

  

多对多的关联映射

多对多一般创建第三张中间表来维护两个表之间关系
场景:公司里面一个用户有多个角色,一个角色就多个用户
 
第一步:创建实体类对象(user  ,role)
第二步:在user.java表示role和在role.java表示user
user.java表示role
private Set<Role> setRole = new HashSet<Role>();  
public Set<Role> getSetRole() {  
    return setRole;  
}  
public void setSetRole(Set<Role> setRole) {  
    this.setRole = setRole;  
}

  role.java表示user

private Set<User> setUser = new HashSet<User>();  
      
    public Set<User> getSetUser() {  
        return setUser;  
    }  
    public void setSetUser(Set<User> setUser) {  
        this.setUser = setUser;  
    }

  

第三步:配置两个类的基本映射
第四步:分别在配置文件中配置
user配置role
<!--   
    name  角色set集合名称  
    table 第三张表的名称  
     -->  
    <set name="setRole" table="t_ub">  
    <!-- 配置当前映射文件在第三张表外键名称 -->  
        <key column="uid"></key>  
        <many-to-many class="路径" column="rid"></many-to-many>  
    </set>  

  role配置user

 <!--   
name  角色set集合名称  
table 第三张表的名称  
 -->  
<set name="setUser" table="t_ub">  
<!-- 配置当前映射文件在第三张表外键名称 -->  
    <key column="bid"></key>  
    <many-to-many class="路径" column="uid"></many-to-many>  
</set>  

  

由于t_user表与t_role没有外键关联,可以直接进行crud操作,两表的关系通过第三张表来维护(后面会写第三张表的维护)
posted @ 2017-09-23 19:43  巴_卫  阅读(191)  评论(0编辑  收藏  举报