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
多对多只能是连接表的关联方式,这很容易理解。
这次有点复杂,会把每种情况的实体类的结构贴出来:
多对多 单向 关联(如下):
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
相关文章推荐
- Hibernate Oracle sequence的使用技巧
- jsp Hibernate批量更新和批量删除处理代码
- jsp hibernate的分页代码第1/3页
- Struts2+Hibernate实现数据分页的方法
- Hibernate环境搭建与配置方法(Hello world配置文件版)
- JAVA+Hibernate 无限级分类
- SSH整合中 hibernate托管给Spring得到SessionFactory
- jsp hibernate 数据保存操作的原理
- hibernate中的增删改查实现代码
- 解决hibernate+mysql写入数据库乱码
- java优化hibernate性能的几点建议
- java Hibernate延迟加载
- hibernate 常用方法介绍
- 详解Java的Hibernate框架中的注解与缓存
- 浅析Java的Hibernate框架中的继承关系设计
- Java的Hibernate框架中的继承映射学习教程
- Hibernate实现批量添加数据的方法
- Hibernate4在MySQL5.1以上版本创建表出错 type=InnDB
- JQuery+Ajax+Struts2+Hibernate框架整合实现完整的登录注册
- SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示