继续理解多对多的单向与双向关联。还是用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