2018年9月

u=1194465232,98399045&fm=26&gp=0.jpg
百度了一下:
首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作。

首先hibernate在实现ORM功能的时候主要用到文件有:映射类javabean,映射文件hbm,数据库配置文件cfg

下面介绍一下每个的作用:

映射类javabean:能够把表中的字段描述成属性,描述了数据库中的结构,可以把数据库中数据映射成对象来供我们的操作。
映射文件hbm:描述了表中所有的属性和javabean中的关系,包括结构,属性,字段等等,是映射成对象必不可少的条件
数据库配置文件:描述了数据库信息,包括方言,连接url,账号和密码,以及连接入口和与映射文件hbm的主要组成部分。

在hibernate中一共有7种映射关系:

1.一对一单向关联映射

有2种策略实现一对一的关联映射:
分别是主键和外键

主键:

口述:让两个表有相同的主键进行关联,数据库没有额外的字段来维护他们的关系,也没有其余的表来维护关系

外键:

口述:本来是多对一的配置,也可以用来表示一对一的关系,其实也就是多对一的特殊情况。

2.多对一的单项

口述:即在多的一方加入一方的外键,指向一的一方,由多方维护关系

关键配置代码:

1. 

3.一对多的单项

口述:其实是与多对一的方向不一样,即在一方加入多方的外键。

在一对多的情况下,要在一方容纳多的数据,要定义set集合,要在配置文件中配置一下

1. 

2. 
  <key column="classesid"/>  
3. 
  <one-to-many class="com.hibernate.Student"/>  
4. 

set中的name指的是在一方实体类中定义的集合名称,key指本类的主键,one-to-many中写入class路径是,多方的路径

缺陷:因为多的一端Student不知道Classes的存在(也就是Student没有维护与Classes的关系)所以在保存Student的时候关系字段classesid是为null的,如果将该关系字段设置为非空,则将无法保存数据,常用解决办法是改用双向关联映射

4.多对多的单项

如果要维护多对多的,那么就要额外一张表来维护,才能完成基本的映射关系

把两张表的主键,放在一张表中,可以通过id来查询2边的信息

1. 

2. 
 <key column="user_id"/>  
3. 
 <many-to-many class="com.hibernate.Role" column="role_id"/>  
4. 

单项多对多,可以任意地在一个hbm中加入以上代码

5.双向一对一主键和外键

对比单项一对一来说,只需要加入标签即可,它不影响,它只会影响加载速度

主键配置:

1. 

外键配置:

1. 

简要讲述一下外键配置的内容:name是对方的类名,property-ref是本类的主键,充当person类的外键,来保持关联

6.双向一对多

双向一对多是为了解决单向一对多的缺陷而设计的。

hbm配置方法

在一的一方配置set配置文件,在多的一方配置many-to-one

1. 

2. 
   <key column="classesid"/>  
3. 
  <one-to-many class="com.hibernate.Student"/>  
4. 

1. 

其中的inverse属性本意是反转,如果为true说明本端不能维护关系,为false说明本端可以维护关系

值得注意的一点是:inverse是控制方向的反转,只影响存储

通常是在多的一方维护关系,所以一般反转都会打开。

7.双向多对多

和单向多对多的区别就是,要同时维护关系,而且加载资源的时候也要同时加载,即也要同时配置

注意的是:

生成的中间表名必须一样,字段必须一样

1. 

2. 
   <key column="role_id"/>  
3. 
   <many-to-many class="com.hibernate.User" column="user_id"/>  
4. 

1. 

2. 
  <key column="user_id"/>  
3. 
  <many-to-many class="com. hibernate.Role" column="role_id"/>  
4. 

最后的总结:首先双向一对多的映射,是用的比较频繁的,所以要彻底领悟几种映射关系,需要多敲代码

转载请说明出处和网址