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

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

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::orcl</property>
<property name="connection.username">sa</property>
<property name="connection.password"></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

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

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

  1. Hibernate关联映射(多对一 --- many-to-one)

    转自:https://blog.csdn.net/fengxuezhiye/article/details/7369786?utm_source=blogxgwz9 Hibernate的关联映射关系有 ...

  2. (五)hibernate关联映射之——多对一映射

    单向多对一关联: 1.多对一的关系和关系数据库中的外键参照关系最匹配,即在己方(多方)的表中的一个外键参照另一个表的主键: 2.通过在多方持有一方的引用实现,需要在“多”的一端使用<many-t ...

  3. hibernate关联映射之多对多

    package loaderman.c_many2many; import java.util.HashSet; import java.util.Set; /** * 开发人员 * * */ pub ...

  4. (转)Hibernate关联映射——一对多(多对一)

    http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...

  5. Hibernate关联映射(一对多/多对多)

    版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053.  Hibernate关联映射上接Hibernate持久化类:h ...

  6. 第三章Hibernate关联映射

    第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...

  7. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  8. Hibernate关联映射 映射文件的配置

    一:多对一单向关联 首先我们必须创建两个实体类 例如:Dept类 public class Dept { private Integer deptNo; private String dName; p ...

  9. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  10. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

随机推荐

  1. 客户端向服务端传送特殊字符解决方法(检测到有潜在危险的 Request.Form 值)

    当客户端向服务端传输特殊字符时报错,错误信息如下图:

  2. [javascript]模拟汉诺塔

    看了博文自己动手写了代码. 这能值几个钱? 请写代码完成汉诺塔的算法:void Hanoi(int maxLevel); 比如2层汉诺塔,需要打印(Console.WriteLine)出如下文本: A ...

  3. KnockoutJS 3.X API 第三章 计算监控属性(4)Pure computed observables

    Pure computed observables Pure computed observables是KO在3.2.0版本中推出的.她相对于之前的ComputedObservables有很多改进: ...

  4. CSS3 transform 属性详解(skew, rotate, translate, scale)

    写这篇文章是因为在一个前端QQ群里,网友 "小豆豆" (应他要求要出现他的网名......) ,问skew的角度怎么算,因为他看了很多文章还是不能理解skew的原理.于是,我觉得有 ...

  5. 微软BI 之SSIS 系列 - 使用 SQL Profilling Task (数据探测) 检测数据源数据

    开篇介绍 SQL Profilling Task 可能我们很多人都没有在 SSIS 中真正使用过,所以对于这个控件的用法可能也不太了解.那我们换一个讲法,假设我们有这样的一个需求 - 需要对数据库表中 ...

  6. CSS隐藏元素的N种实现方式。

    1. width:0; 光有高度是不行的,还得有宽度.缺点文字隐藏不了,可以加个color:#fff和背景颜色一样就ok了,障眼法,迷惑人的,其实内容还在,如果有文字的话,还是可以触发点击事件的,这种 ...

  7. MVVM模式下,ViewModel和View,Model有什么区别

    摘自正美的5群 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就是展现出来的用户界面. 基本上,绝大多数软件所做的工 ...

  8. PL/SQL异常处理

    As we all known,程序的错误一般分为两类:编译错误和运行时错误.其中运行时错误被称为异常.PL/SQL语句块中处理异常的部分即为异常处理部分.在异常处理部分,可以指定当特定异常发生时所采 ...

  9. Linux - Tips

    01 - Linux的系统结构 Linux 系统结构详解 02 - 执行多条命令 方法1:在命令行下可以一次性粘贴多条语句,shell会依次执行并输出结果 方法2:在一个命令行中,用分号将各个命令隔开 ...

  10. 24个 HTML5 & CSS3 下拉菜单效果及制作教程

    下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...