序言
写这篇文章之前,自己也查了很多的资料来搞清楚这两者的关系和各自所做的事情,但是百度一搜,大多数博文感觉说的云里雾里,可能博主自己清楚是怎么一回事,但是给一个不懂的人或者一知半解的人看的话,别人也看不懂其中的关系,所以我自己写博文的时候,会尽量用通俗通俗在通俗的语言去描述一个概念,希望能尽自己的力量去帮助你们理解。光看我的是不行的,最关键的是要自己动手去实践一遍,能得出一样的结论,那就说明懂了,在我不懂的时候,我就去自己实现它,一次次尝试,慢慢的就总结出规律了。
--WH
一、外键
我为什么要把这个单独拿出来说呢?因为昨天我才发现我自己对这个外键的概念原来理解偏差了,并且很多人估计和我一样,对这个东西理解错了,现在就来说说一个什么误区。
1、这张表的外键是deptId把? 2、这张表有外键吗?
大多数人这里说的外键,度是指的一张表中被外键约束的字段名称。这是很多人从一开始就默认的,其实并不然,
解释:对于每张有外键约束这个约束关系的表,都会给这个外键约束关系取一个名字,从给表设置外键约束的语句中就可以得知。
CONSTRAINT 外键名 FOREIGN KEY 被外键约束修饰的字段名 REFERENCES 父表名(主键)
所以说,平常大多数人口中的外键,指的是被外键约束修饰的字段名,外键关系是有自己的名称的。这点大家需要搞清楚,虽然平常影响不大,但是到真正关键的地方,自己可能就会被这种小知识点给弄蒙圈。
二、cascade(级联)关系
为什么要把这个单独拿出来讲一篇文章呢?因为我在看别人博文时,就把cascade和inverse和那几种关联关系连在一起讲了,并且是那种一笔带过的描述,写的比较简单,其实理解了确实很简单,但对于刚开始学的人来说,这将会是一个大的灾难,一知半解是最难受的了。
解释:级联,就是对一个对象进行操作的时候,会把他相关联的对象也一并进行相应的操作,相关联的对象意思是指 比如前两节学的一对多关系中,班级跟学生,Student的实体类中,存在着Classes对象的引用变量,如果保存Classes对象的引用变量有值的话,则该值就是相关联的对象,并且在对student进行save时,如果保存Classes对象的引用变量有值,那么就会将Classes对象也进行save操作, 这个就是级联的作用。
说大白话这个意思很难到位,举个员工和部门 双向一对多的例子把。
创建实验环境(这个可以自己去实现一下,练习一下关联关系的配置)
首先得对这两个表的关系图弄清楚,在接下来的所有分析中,度要带着这个关系去分析,你才不会蒙圈
Staff.java 和 Staff.hbm.xml
public class Staff { private int id; private String name; private Dept dept; 。。。 } //Staff.hbm.xml <hibernate-mapping> <class name="oneToMany.Staff" table="staff"> <id name="id" column="id">
//设置的increment,这个应该看得懂, <generator class="increment"></generator> </id> <property name="name"></property> //name:staff实体类中的dept属性,column:子表中被外键约束修饰的字段名 class:Staff相关联的Dept类 <many-to-one name="dept" column="deptId" class="oneToMany.Dept"></many-to-one> </class> </hibernate-mapping>
Dept.java 和 Dept.hbm.xml
public class Dept { private int id; private String name; private Set<Staff> staffSet = new HashSet<Staff>