hibernate的关联

  1. 什么是关联(association)
    1.1 关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。例如:
    public class A{
    private B b = new B;
    public A(){}
    }
    1.2 关联的分类:关联可以分为一对一、一对多/多对一、多对多关联
    关联是有方向的

#关键点都在数据库中的外键上面,请好好理解下面这二句SQL和一对多及多对一的关系
#select * from Order where orderId=? //这条SQL返回对应的1个订单
#select * from OrderItem where oid=? //这条SQL返回1订单对应的N个订单项
#通过这二条SQL不难看出,外键在这里有二个用途:查找客户的订单,查找订单对应的订单项
2. 案例:如何建立订单和订单项一对多双向关联
2.1 先不建立客户和订单的关联关系,定义实体及映射文件,单独执行保存操作
2.2 建立客户到订单的一对多关联关系



2.3 建立订单到客户的多对一关联关系

  <!--1.注释 2.只读-->
  <property name="oid" type="java.lang.Integer" column="oid" insert="false" update="false">
  </property>

2.4 注意:在Hibernate当中定义实体对象的集合属性时,只能使用接口而不能使用类

#insert属性设置中主控方概念理解:
3. 以客户和订单的一对多双向关联为例,讲解Set元素中的cascade|lazy属性作用
3.1 lazy:默认值为true,true延迟加载,false立即加载(一般设置为true,不使用立即加载,因为影响查询性能)
开发过程中一般用代码去控制延迟加载或者立即加载 Hibernate.initialize(o.getOrderItems());

3.2 cascade:用来控制如何操作关联的持久化对象的
3.2.1 none:保存,更新或删除当前对象时,忽略其它关联的对象
3.2.2 save-update:保存、更新时级联保存所有的临时对象,并且级联更新关联的游离对象
3.2.3 delete:通过session的delete方法删除当前对象,级联删除关联的对象
3.2.4 all:等于save-update操作+delete操作

小结:
多方的CRUD与没有建立关联关系之前的操作一致
一方的CRUD与没有建立关联关系之前的操作有变化
D:删除一方之前先删除多方
C:级联操作
R:代码控制多方

  1. 数据库的多对多
    1.1 数据库中不能直接映射多对多
    处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多

    注1:数据库多表联接查询
    永远就是二个表的联接查询

        A   B   C  D
           t1   C
                t2 D
                   t3
    

    注2:交叉连接
    注3:内连接:
    外连接:left(左)/right(右)/full(左右)
    主从表:连接条件不成立时,主表记录永远保留,与null匹配

  2. hibernate的多对多
    2.1 hibernate可以直接映射多对多关联关系(看作两个一对多)

  3. 多对多关系注意事项
    3.1 一定要定义一个主控方



3.2 多对多删除
3.2.1 主控方直接删除
3.2.2 被控方先通过主控方解除多对多关系,再删除被控方
3.2.3 禁用级联删除
3.3 关联关系编辑,不需要直接操作桥接表,hibernate的主控方会自动维护

猜你喜欢

转载自blog.csdn.net/anhldd/article/details/83186874