• Hibernate关联映射(单项多对一和一对多、双向一对多)


      最近总是接触着新的知识点来扩展自己的知识面;不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢......

     一、用员工和部门来剖析关联映射的原理。

    1)从这张截图可以看出我会站在员工的角度讲述:(单向关联)

      关系:(多个员工对应一个部门)多对一的关系

      意味:多个Emp对象只会引用一个Dept对象

      方法:在Emp类中定义一个Dept类型属性,来引用所有关联的Dept对象

    eg.

      第一步建立两个实体类省略

      第二步建立大配置

      

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
                
        <session-factory>
    
            <!-- Database connection settings 数据库连接设置-->
            <!-- 驱动类 -->
            <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
            <!-- url地址 -->
            <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
            <property name="connection.username">sa</property>
            <property name="connection.password">1</property>
    
            <!-- SQL dialect  (SQL 方言) -->
            <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
    
    
            <!-- Echo all executed SQL to stdout 在控制台打印后台的SQL语句 -->
            <property name="show_sql">true</property>
            
            
            <!-- 格式化显示SQL -->
            <property name="format_sql">true</property>
            
        
            <!-- Drop and re-create the database schema on startup -->
              <property name="hbm2ddl.auto">update</property>  
              
             <!--  <property name="current_session_context_class">thread</property> -->
             <!-- 配置Hibernate.cfg.xml开启二级缓存 -->
               <property name="hibernate.cache.use_second_level_cache">true</property>
              <!-- 配置二级缓存的供应商 -->
            <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
             <!--  * 在hibernate.cfg.xml文件中启用查询缓存-->
        <property name="hibernate.cache.use_query_cache">true</property>
              
             
              
            <!-- 关联小配置 -->
             <mapping resource="cn/happy/entity/Dept.hbm.xml" />
            <mapping resource="cn/happy/entity/Emp.hbm.xml" /> 
             
             <class-cache    usage="read-write" class="cn.happy.entity.Dept"/>
        </session-factory>
    
    </hibernate-configuration>

      第三步创建小配置Emp

      <!-- 植入一个Dept对象 : 多对一-->
          <many-to-one name="dept" class="Dept" column="deptNo"></many-to-one> 关键代码
       解析:<many-to-one>:元素建立了Dept属性和Emp表的DEPTNo之间的映射关联
          name:设定持久化类的属性名
          column:name对应表的外键(Emp表的外键)
          class:设定持久化类的属性类型
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="cn.happy.entity">
       <class name="Emp" table="EMP">
          <id name="empId">
            <generator class="sequence">
              <param name="sequence">SEQ_NUM</param>
            </generator>
          </id> 
          <property name="empName" type="string"/>
          
          <!-- 植入一个Dept对象 : 多对一-->
          <many-to-one name="dept" class="Dept" column="deptNo"></many-to-one>
       </class>
    </hibernate-mapping>

    第四步创建小配置Dept

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="cn.happy.entity">
       <class name="Dept" table="DEPT">
       <!--  <cache usage="read-write"/> -->
          <id name="deptNo">
            <generator class="sequence">
              <param name="sequence">SEQ_NUM</param>
            </generator>
          </id> 
          <property name="deptName"/>
       </class>
    </hibernate-mapping>

    第五步就是测试类

    @Test
            public void AddObjectToDept(){
                Emp emps=new Emp();
                emps.setEmpName("西丽");
            Session session=HibernateUtil.currentSession();
                Transaction tx = session.beginTransaction();
            session.save(emps);
            System.out.println("ok");
            tx.commit();
            HibernateUtil.closeSession();
            }

    第六步运行结果

    上述结果:现将数据查找一遍确保没有在进行添加

     2)从截图可以看出我接下来就要站在部门Dept的角度剖析:(单项关联)

       关系:(部门)一对多关联

       意味:每一个Dept对象会引用一组Emp对象

       方法:Dept类中应该定义一个集合类型属性,来引用所有关联的Emp对象。

      与上述步骤唯一不同的就是Dept.hbm.xml的小配置

      关键代码一对多<set name="emps">

                    <key column="deptNo"></key>
                    <one-to-many class="Emp" />
                </set>
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="cn.happy.entity">
       <class name="Dept" table="DEPT">
       <!--  <cache usage="read-write"/> -->
          <id name="deptNo">
            <generator class="sequence">
              <param name="sequence">SEQ_NUM</param>
            </generator>
          </id> 
          <property name="deptName"/>
    
          <set name="emps">
            <key column="deptNo"></key>
            <one-to-many class="Emp" />
          </set>
       </class>
    </hibernate-mapping>

    二、双向关联

      

    如上图所示:满足多对一和一对多的关联就是双向关联。

    三、cascade属性

      问题:删除Dept对象,并级联删除与Dept对象关联的Emp对象

      解析:我们可以在<set>、<many-to-one>元素里面写cascade=“delete”属性就能完成并级联删除

       

    cascade属性值               描述                    
    none       当Session操纵当前对象,忽略其它的关联对象   cascade的默认值none
    save-update       保存或者更新数据
    delete     当通过Session的delete()方法删除当前对象时会级联删除所有的关联的对象
    all     包含save—update和delete

          初学者的我理解所致,既有不足,请多多指教。

  • 相关阅读:
    爬取1907条『课程学习』数据,分析哪类学习资源最受大学生青睐
    以『B站』为实战案例!手把手教你掌握爬虫必备框架『Scrapy』
    python爬取各类基金数据,以『动图可视化』方式展示基金的涨跌情况
    详细实战教程!部署Flask网站+域名访问+免费https证书
    王者荣耀白晶晶皮肤1小时销量突破千万!分析网友评论我发现了原因
    python爬取『大年初一』热映电影,以『可视化及词云秀』方式带你了解热映电影...
    python爬取44130条用户观影数据,分析挖掘用户与电影之间的隐藏信息!
    Nanopore sequencing and assembly of a human genome with ultra-long reads
    Genome Sequencing and Assembly by Long Reads in Plants
    SiLiCO: A Simulator of Long Read Sequencing in PacBio and Oxford Nanopore
  • 原文地址:https://www.cnblogs.com/yejiaojiao/p/5790043.html
Copyright © 2020-2023  润新知