现在才开始学习hibernate,知道关联大概有3种:多对一/一对多, 一对一,多对多
现在有些简单的疑问需要请教:1.单双向关联是什么?每种关联都可以分为单向和双向吗?
2.用hibernate设定关联了,假如不在数据库本身设定关联,是不是也可以(不影响增删改级联)?
3.主控方又是什么?每种关联都可以设定主控方吗?

解决方案 »

  1.   

    问题1. 是的,每种关联都分单向和双向。但是单双向在数据库层面上是没有区别的,使用上区别阐释如下://一对多,双向
    class A {
        private int id;
        private Set<B> bs;
    }class B {
        private int id;
        private A a;
    }上面的例子是一对多双向,这种时候,你只要加载了A 的实例 a ,则可以很简单地用a.getBs()来取得关联的 B 的集合;
    反过来,你加载了B 的实例 b,也可以简单地用 b.getA() 来取得其关联的 A 实例。
    //一对多,单向
    class A {
        private int id;
        //private Set<B> bs;
    }class B {
        private int id;
        private A a;
    }上面这个单向的例子,很简单地,你加载了B,很容易就能得到与其关联的A;反过来你加载了A,却不能简单地获得关联的所有的B实体(这个时候只能用HQL查询了,超出此帖范围)。
    问题2:你在Hibernate里面设置了关联,并且也使用了Hibernate 的SchemaExport来生成数据库结构,那么一般来说数据库层面上的关联也都已经做好了。如果是应用在现存数据库上,那么关联关系就是纯粹由Hibernate来维护了,你所提到的级联删除问题,只要是你在hibernate下用映射实体进行的操作,那么这些你都不需要担心级联问题,Hibernate会帮你处理。即使数据库层面上没有相关的关联constraint,因为hibernate的级联操作最终是落实到SQL语句上的,从来也都没用到数据库native的级联功能,所以并无影响。
    问题3:是的,每一种映射都可以指定主控方。所谓“主控方”其实就是告诉Hibernate,我这个CRUD操作到底应该由该关联的哪一头的实体来最终发出SQL语句。一般来说只能在“多”的一头指定主控方,inverse=true 就是指定 “一” 的那一方来发出SQL,inverse=false 则“有可能”是自己这一方(“多”)生成SQL。这里面一时半会说不完,比较简便的使用规则是,尽量指定“一”的一方作为主控,这样SQL的效率会比较高。
      

  2.   

    1.单向关联是只有方关联另一方;多项关联是双方都有属性与对方关联,每种关系都是有单双2中关联;
    2.这样的是可以的,数据库中没有关联,没有外键,但是可以在hibernate中可以通过配置来管理;
    3.主控方是用于配有级联关系情况才有效的,主控方是指主动维护双方关系的一方。是通过配置来实现的。