• 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操作,两表的关系通过第三张表来维护(后面会写第三张表的维护)
  • 相关阅读:
    php中的heredoc和nowdoc对比
    PHP官方网站及PHP手册
    php扩展编译方法
    linux下修改时间和时区
    个人觉得非常好用的mysql客户端工具HeidiSQL
    mysql主从复制总结
    mysql优化的21条经验(转)
    mysql存储引擎选择(转)
    show profiles 分析sql耗时瓶颈
    tar命令的使用方法
  • 原文地址:https://www.cnblogs.com/durui/p/7582281.html
Copyright © 2020-2023  润新知