您的位置:首页 > 其它

Hibernate关联映射(5)

2016-07-13 12:05 316 查看
继续理解多对多的单向与双向关联。还是用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息