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

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

时间: 2024-10-13 16:25:29

Hibernate关联映射(单项多对一和一对多、双向一对多)的相关文章

【Hibernate步步为营】--关联映射之多对一

上篇文章讨论了Hibernate的基本映射,一个实体类对应着一张表,在相应的Hibernate Mapping文件中使用<class>标签映射.并且实体类中的普通属性对应着表字段,使用<property>标签映射.另外在构造实体类时应注意:在实体类中应实现无参的默认的构造函数,提供一个标示,建议不要使用final修饰实体类,为实体类生成getter和setter方法,最后介绍了几种主要的主键生成策略,接下来讨论多对一映射. 一.关联映射之多对一 对于多对一关联映射其实很容易理解,在

千山万水之Hibernate(七)——关联映射(多对多)

一直认为通过写SQL语句来处理多对多的情况比较复杂,对表关系必须是理解的非常清楚,在学习了Hibernate中的多对多处理后,想想其实多对多也没什么,只不过多了一张表,如果说多了一张表感觉复杂了,Hibernate中我们完全不用去理会他,直接去操作关联实体就可以了,从这点上看,Hibernate为我们做了很多事,确实功不可没. 在有了Hibernate这个帮手后,今天一起看看我们在Hibernate的基础上进行一些操作. 原理分析 我们拿学生和课程为例子来分析,所谓的多对多关系可以这样理解:一个

Hibernate 关联映射

ORM(Object Relational Mapping)对象/关系映射 说到Hibernate的关联映射就必须要提一提ORM了.那么ORM是什么呢,其是一种持久化技术,他在对象模型和关系型数据库之间建立对象关系,通过操作JavaBean对象来完成对数据库的操作! 注意:ORM是概念化的并不是实际存在的,可以理解为其是一种编程思想,而Hibernate框架就是该思想的实现产品! 配置Po对象(和数据表绑定的持久化对象)的关联关系 从上面说到ORM可以在对象模型和数据库之间建立对应关系而在Hib

Hibernate实体映射文件多对多等关系简单应用技巧

第一步,写注释: <!--xx属性,本类与Yy(类)的多对一 --> <!--xx属性,本类与Yy(类)的一对多 --> <!--xx属性,本类与Yy(类)的多对多 --> <!--xx属性,本类与Yy(类)的一对一 --> 第二部,拷模版 <!--xx属性,本类与Yy(类)的多对一 --> <many-to-one name="" class="" column="">&l

第六章 Hibernate关联映射

第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一加载策略二.关联关系1.单向多对一关联关系1.1.概念(什么是单向多对一关联关系,举例说明)  以部门(Dept).Emp(员工)为例: 从员工角度看部门,是多个员工都在一个部门,这就叫单向 如部门编号为20的部门下可以有n个员工(如scott账户下emp表 empno 为7369,7566,778

hibernate关系映射(多对一)

对多一关系是最普遍也是最重要的一种对象关系,其中又包括了单向的多对一,单向的一对多以及双向的多对一关系 单向多对一 多的一方:学生(Student) 一的一方:班级(Grade) 班级类的定义以及hbm文件配置如下 1 public class Grade { 2 private int id; 3 private String name; 4 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTY

hibernate关系映射(多对多)

多对多关系(学生Student,课程Course) 学生类的定义以及hbm文件的配置如下 1 public class Student { 2 private int id; 3 private String name; 4 private Set<Course> courses = new HashSet<Course>(); 5 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <

hibernate关联映射(一对多)

这篇博客将会给大家带来hibernate的关联映射的学习.在现实生活中,不仅只是一对一的映射关系,更多的是一对多,多对多等. 一对多单项关联映射 这里我以网盘为例,一个用户可以拥有多个文件,及用户和文件之间是一对多的关系. user实体类: public class Users { private int uid; private String uname; //用户上传的所有文件 // one方 可以获取 many方 private Set<UpFile> files = new HashS

hibernate关联映射之一对多&amp;多对一

package loaderman.b_one2Many; import java.util.HashSet; import java.util.Set; public class Dept { private int deptId; private String deptName; // [一对多] 部门对应的多个员工 private Set<Employee> emps = new HashSet<Employee>(); public int getDeptId() { re