hibernate.hbm2ddl.auto
有以下这几种属性: create update create-drop validate
create:在每次 创建sessionFactory时都会创建一个表,在有这张表的情况下,会将这将表删除并重新创建一次。
update:增量更新数据库,如果说所对应的实体类有更改的话,会用这个属性增加数据库里的数据,会将相应字段增加到原来的表中,而且字段只会越来越多 不会减少。
create-drop:这个属性是用来创建临时表的,首先跟create一样在每次创建sessionFactory时都会创建一个表,而如果调用了sessionFactory中的close方法 即就将该数据表删除了。
validate:校验的属性,实体类中配置的属性,数据表中必须与之对应,不然测试中就会出现报错。
hibernate映射文件
主要是用来配置 类到表 属性到字段 对象到每一条记录 的映射.
以下配置
package:对应的是实体类的包,
理论上是可以在一个映射文件中写多个类的,实际上我们只用写一个映射文件来对应一个类即可.
class标签:class标签对应的就是实体类
属性主要有
name:对应java实体类的类名,这个是必须要有的
table:对应的是数据库中的表名,这个可选,如果不写的话所对应的表名直接就默认是java实体类的名字了
(数据库中是不区分大小写的)
class子元素
id:对应的就是数据库中的主键,即java实体类中id的主键(hibernate中必须要求提供主键)
property:对应的是普通的属性,即数据库中的某一列字段.
(最后将映射文件的路径配置到hibernate配置文件中的mapping属性即可)
--------------------------------
以上都是初识hibernate进行的相关配置与了解,可以说是运用hibernate的一些准备工作,在学习每一款框架时我们都要了解其中的核心思想,从而才能运用的如鱼得水一般,学习一款框架之前 也要尝试的去爱上他 这样才能深刻的了解对方 最主要的就是能拿到手好好对待他。
Hibernate中的三种状态
前面都说到hibernate是基于ORM的框架,是通过对象来操作关系型数据库的。
从而为了保证操作数据稳定的进行,hibernate把对象定义了三种状态
即 瞬态,持久态,游离态。
瞬态:也称临时状态,在每一次创建新的对象的时候出现的状态。
存在于JVM内存中,这时hibernate根本就不知道他的存在,在等待hibernate将他转化为持久态。
持久态:(在hibernate中调用session工厂,然后再调用openSession获得hibernate中的session对象)这个session对象在调用save或者update等方法时 就直接将瞬态的对象转化为持久态的对象。
此时对象由JVM虚拟机内存中转化到session的缓存当中,此时该对象等待与数据库进行同步操作。
游离态:通过事务提交,将数据存入到数据库中。
此时如果session关闭,此时的对象就转化成了游离态。
native :主键不用管,全靠数据库。
assigned:主键框架不用管,有程序处理。
foreign:使用某个表的主键做本表的外键。
Hibernate的关联操作
顾名思义 mysql里就触及到多表联查的功能,Hibernate当然也不例外,提供了如何对多张表进行联查的简单的配置。
多张表的联查分别有 一对多 | 多对一 | 多对多 | 一对一 的这几种状态
这里首先要理解这几个状态,举个平时都见过的例子,(淘宝购物系统)
在淘宝上每次购物都要下订单,订单当然可以下多个,所有在一个用户中对应多个订单,这时候的关联状态就是一对多。
在订单的角度去看 是多个订单都对应一个用户,所以这时候的关联状态则是多对一。
在订单中都会有多个商品,而在商品中也会有多个订单同时都购买他,所以这时候的状态就是多对多。
最后一对一的这种关联状态 在生活中也很少见,以后用的也相对少一点,比如一个人只对应一个身份证,身份证也只对应这一个人,这时候才能构建出一对一的关联状态。
关联也分两种性质
双向关联:在有关联关系的两个对象中都将关系体现了出来,在查询的时候 两边都可以查到对方的信息。
维护关系的时候 两边都可以维护。
单向关联:在有关联关系的其中一个对象中将关系体现出来,在查询的时候 只有这一边可以查到对方的信息。
维护关系的时候 只有这一边要进行维护。
项目大部分的时候 我们使用的都是单向关联,因为双向关联容易造成死循环,维护起来也麻烦
下面来具体介绍下这几种关联状态的关系
单向关联一对多
首先创建两张表所都对应的实体类,提供get set方法 这里必须要有空参的构造方法,如果要设置有参的构造,另外要再写一个空参的构造。
在实体类 要多写一个用来配置关系的属性,这里一对多的情况下 要用set集合存放多的那一实体类中的数据,所以要通过set集合的类型来添加这个属性,比如 private Set<所对应多的实体类的类> 也要同时设置get set方法.
下一步就是在配置关系的这个类的映射文件中 配置Set的标签 以及 one to money 的标签属性
这样配置文件大体上就完工了,下来再看如何将一张表中的数据 存放到另一张表的对应关系中。
首先通过 session.get()方法将 数据库中的记录 转化为 持久态的状态。
在一的一方要调用set集合的对象
再通过Set集合里的add方法 将一方的数据存进这张关系表中。提交事务从而达成两张表的连接关系.
单向关联多对一
多对一跟一对多相比 实现的关联效果是一样的,就是从不同角度来建立关系,之前一对多是根据Set集合来存储多的数据,在多对一的角度来看, 不需要利用集合,因为所需要关联的对象仅此只有一个,所以在实体类中 只需要 配置 所对应关系的实体类的 类和类名 即可。
在配置映射文件中也非常的简单,
只需要配置 many to one 这个标签里的属性即可
name是对应实体类中配置的 对应一的属性名 class是对应一的类名 column 一样表示的是外键列.
多对一的实际操作也非常简单,直接通过实体类的set方法存另一方的持久态的值即可
单向关联多对多
多对多的实现其实在关联关系上都是一对多的道理
只不过需要个中间表来建立两边对应表的中间关系
在实体类的属性配置中跟一对多是一样的 都是用到了set集合
在映射文件的配置当中需要配置要建立中间表的关系 具体如下
table:加了table属性 就说明是多对多的关系, table中所写的就是所建立 中间表的名字
key:column 属性表示 当前配置类 将自己的主键放在中间表的哪一列中 里面写列名
many to many :中的column属性表示的是另外一张表将自己的主键放在中间表的哪一列中
单向关联一对一
配置一对一有两种思路
第一种是利用一对多或者多对一的关系进行配置
第二种 是直接利用one to one 一对一的标签进行配置
此时要分清主次,配关系一般配置次的一方,或者配双向。(尽可能的去配双向)
Hibernate查询
查询是持久层状态中最重要的一个部分
Hibernate也提供了相应的支持 将查询分为了三种方式
1.原生查询
2.条件查询
3.HQL查询
原生SQL查询
Hibernate提供了对sql语句直接利用的查询
但hibernate是一种ORM框架 直接操作对象的 而SQL是面向数据 面向表的
所以Hibernate 并不建议 用这种查询方式