关联关系:
通过类图展示的方式讲解类与类之间的关联关系,类与类之间存在着单向关联,也存在着双向关联.
多对一类图举例:
eg:
在员工表中植入一个dept对象,根据一个员工编号查询所属的部门:
1.Emp实体中除了自身属性外植入一个Dept对象,
2.小配置,在Emp.hbm.xml中映射:
加多一个标签many-to-one ,name指的是Emp表中植入的Dept对象起的那个名字,column指的是数据表中关联的表名,class指的是关联的实体类名
3.大配置关联小配置:
4.单侧,根据Emp表中员工编号为7369来查询他所属的部门,如下:
一对多类图举例:
1.类中需要注意的地方:员工表中植入一个Dept对象,部门表中植入一个Emp集合
Emp表:
Dept表:
2.映射文件:
dept.hbm.xml中做映射:
加一个集合set标签,name指的是在Dept中植入的set集合起的名字,column指的是多的一方表的外键列,class指的是创建关联关系的类名
3.大配置:
4.单侧,一对多双向关联,通过部门获取该部门下的所有员工:
解说:用hql语句查询部门表,返回一个集合对象,然后可以遍历部门表中的信息,然后在遍历员工表的信息(因为部门实体植入了一个员工集合,所以可以直接用部门对象点getEmp()方法,然后就可以根据部门获取该部门下的员工了),如下:
//通过某个元获取该员工所在的部门(跟上边同理,用员工对象点出获取部门信息的方法获取需要查询的某个员工所在部门信息)
一些属性(Cascade,inverse,order by):
1.如何实现添加部门的同时自动添加员工
可以使用cascade(级联)方式
Cascade取值:
None,save-update,delete和all
none:当Session操纵当前对象时,忽略其他关联的对象。它是cascade属性的默认值.
Save-update:当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的瞬时状态的对象,并且级联更新所有关联的游离状态的对象。
Delete:当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。
当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。
All:包含save-update,delete的行为。
注意点:级联也就是说当我们保存持久化对象A的时候自动帮我们保存持久化对象B。
Test类主要代码:
总结:从上述代码中可以看出,我们并没有保存emp对象的代码,但是结果emp对象却被保存到了数据库中。
问题:cascade属性写在什么位置?
解析:一对一或者多对一的时候,直接写在标签上,其他的写在set标签上。
2 set元素的inverse属性(去掉冗余代码)
inverse属性指定了关联关系中的方向。
inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false 。
注意:inverse 决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因 为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用)。
Test类主要代码:
说明:如果我既给员工指定了自己所属的部门,又将员工添加到部门集合中。那么这个时候reverse不设置,生成以下sql
inverse设置为true,不负责维护关联关系
观察发现,其实第二条insert语句已经在员工表中指定了自己所属的部分,没有必要再向数据库发送一条update指令。
将inverse设置成true后,生成的语句如下图所示。
3 order-by
Hibernate如何对集合中的元素进行排序
解析:由于使用Hibernate后,生成SQL的重任交给了Hibernate,所以Hibernate给我们留了一条绿色通道,可以让我们很容易的对集合中的数据进行排序。那就是使用order-by,使用order-by用于在数据库中对集合进行排序。
Set集合设置如下:
Test类主要代码:
结果:
同一个部门下的员工编号按照降序序排序