Hibernate关联映射(5)

来源:互联网 发布:功能测试软件有哪些 编辑:程序博客网 时间:2024/05/21 22:31

继续理解多对多的单向与双向关联。还是用person和address的例子。一个人person有多个address,比如家庭地址,学校地址,公司地址;而一个地址address也对用多人person,如学校地址对应许多学生。

多对多只能是连接表的关联方式,这很容易理解。

这次有点复杂,会把每种情况的实体类的结构贴出来:

多对多  单向 关联(如下):

public class Person1nfk_sx implementsSerializable {

   private int personid;

    privateString name;

   private int age;

   private Set addresses=new HashSet();

 

public class Address1nfk_sx implementsSerializable {

   private int addressid;

private Stringaddressdetail;

上面是类结构,下面是多对多单向关联配置:

 

<hibernate-mapping>    <class name="com.lavasoft.dx._n_n.Personnn" table="PERSON_nn">        <id name="personid">            <generator class="identity"/>        </id>        <property name="name"/>        <property name="age"/>        <!--映射集合属性,join_1ntab是连接表表名-->        <set name="addresses"             table="join_nn"                >            <!--“column="personid"”确定PERSON_1ntab表关联到连接表的外键列名-->            <key column="personid"/>            <!--“column="addressid"”关联PERSON_1ntab表的Address1ntab对象的id在连接表中的列名-->            <many-to-many                    column="addressid"                    class="com.lavasoft.dx._n_n.Addressnn"/>        </set>    </class></hibernate-mapping> <hibernate-mapping>    <class name="com.lavasoft.dx._n_n.Addressnn" table="ADDRESS_nn">        <id name="addressid">            <generator class="identity"/>        </id>        <property name="addressdetail"/>    </class></hibernate-mapping>

多对多  双向 关联(如下):

public classPersonnn_sx {

    private int personid;

    private String name;

    private int age;

    private Set addresses=new HashSet();

 

public classAddressnn_sx {

    private int addressid;

    private String addressdetail;

    private Set persons = new HashSet();

上面是类结构,下面是多对多双向关联配置:

 

<hibernate-mapping>    <class name="com.lavasoft.sx._n_n.Personnn_sx" table="PERSON_nn_sx">        <id name="personid">            <generator class="identity"/>        </id>        <property name="name"/>        <property name="age"/>        <!--映射集合属性,关联到持久化类-->        <!--table="join_1ntab_sx"指定了连接表的名字-->        <set name="addresses"             table="join_nn_sx"             cascade="all">            <!--column="personid"指定连接表中关联当前实体类的列名-->            <key column="personid" not-null="true"/>            <!--column="addressid"是连接表中关联本实体的外键-->            <many-to-many column="addressid"                          class="com.lavasoft.sx._n_n.Addressnn_sx"/>        </set>    </class></hibernate-mapping> <hibernate-mapping>    <class name="com.lavasoft.sx._n_n.Addressnn_sx"           table="ADDRESS_nn_sx">        <id name="addressid">            <generator class="identity"/>        </id>        <property name="addressdetail"/>        <!--table="join_nn_sx"是双向多对多的连接表-->        <set name="persons"             inverse="true"             table="join_nn_sx">            <!--column="addressid"是连接表中关联本实体的外键-->            <key column="addressid"/>            <many-to-many column="personid"                          class="com.lavasoft.sx._n_n.Personnn_sx"/>        </set>    </class></hibernate-mapping>

 

*****多对多 单向 关联*******

         多对多单向关联,对address的配置很简单,就是普通的配置。

         而对person的配置,有了前面的基础就容易理解多了。

         首先是set标签,里面写上要关联的连接表table,再是key标签,写将person主键放到连接表后,列名叫什么。

由于是多对多,只能用many-to-many标签了。column="addressid",关联连接表后,查哪一列呢,就查询addressid列,这一列查出数据后,由于是连接表,肯定是主键的值,这个主键是哪张表的呢,是class="com.lavasoft.dx._n_n.Addressnn"对应的表。然后查到的数据,封装成class="com.lavasoft.dx._n_n.Addressnn"对应的类的实例对象,返回(添加到)给<set name="addresses">

        

*****多对多 双向 关联*******

理解了上面的,那多对多的双向关联理解起来就简单了。由于是双向关联还是多对多的,那两个类的结构中都有set集合用以包含对方类型的对象。

person表的配置和上面差不多的意思,set标签,说明了那个连接表table,然后key标签与上面同样的意思,多对多用many-to-many标签,里面的column以及class与上面意思相同。同样的,我们也可以理解address的配置了。这里以一个实际的例子说一下:

我们想要查到id=1的person对应的所有address,我们按照上面的配置配好后,只要查询id=1的person,person中的set集合会由hibernate自动给我们填上id=1的person对应的所有address对象,通过address.details可以取出具体内容。

执行流程是这样的:在person中查询id=1,查到了结果,然后hibernate根据配置一看,还有连接表要我去关联查询,就去table="join_nn_sx"去查peisonid=1,找到很多条数据,然后取出column="addressid"的那一列的数据,去查class="com.lavasoft.sx._n_n.Addressnn_sx"对应的表,也就是address表,查到好多对应的地址数据,根据class="com.lavasoft.sx._n_n.Addressnn_sx"封装成adderss对象,返回给(添加到)name="addresses"的set集合中。(注意这时,address对象的set集合为空,不为空那还了得,address的set集合中放的是person,为了把set填上,要去查person,结果person中也有set,这样就没完没了了)

同理想要查某个地址对应的多个人也是一样的流程。

好了,hibernate关联映射的14中情况终于都理解完了。这14种情况是根据下面参考资料的第一条学来的,包括例子也是。本系列博文只是一个初学者看了这14种情况的配置后,觉得一次性看完相当糊涂,意欲找到规律。零零散散的算是找到了点规律,对于理解hibernate的运作还是有帮助的。

******参考资料***************

http://lavasoft.blog.51cto.com/62575/39398/  强烈推荐先看,博文写了14种情况下的配置,我就是看了这个再结合其他资料摸索的规律

 

http://blog.sina.com.cn/s/blog_62f0eaa80101bpaf.html

 

http://blog.sina.com.cn/s/blog_62f0eaa80101bpah.html

 

http://blog.csdn.net/sanjy523892105/article/details/7061602

 

http://blog.csdn.net/linminqin/article/details/6324567

 

http://blog.csdn.net/jialinqiang/article/details/8704538

0 0
原创粉丝点击