Hibernate开源框架

9 篇文章 0 订阅

     ORM(Object Relation Mapping,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象而产生的技术,本质上就是将数据从一种形式转换到另外一种形式。Hibernate是一种运用DAO设计模式来实现对象和关系数据库之间映射的开源ORM框架。例如:Hibernate和iBaITS等。

     对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而数据库中,关系数据无法直接表达多对多关联和继承关系,因此,对象-关系映射系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

     一般的ORM需要实现如下部分功能:

     1、一个对持久化对象进行CRUD(Create/Read/Update/Delete)最基本的数据库操作的API。

     2、一个用来规定与类和类属性查询的API。

     3、一个mapping metadata的工具。

     4、一种解决脏读、延迟加载、优化数据库操作的技术。

     Hibernate的核心接口类分别为:Session、SessionFactory、Transaction、Query和Configuration。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。

     1、Session接口:负责执行被持久化对象的CRUD基本数据库操作,但需要注意的是Session对象时非线程安全的。该接口常用方法如下:

      save():将对象保存到session容器中,并且将之变成持久态。

      update():修改session容器中的对象数据,或修改脱管对象的数据并且变成持久态。

      saveOrUpdate():结合了save和update的功能。

      delete():将对象移除出session容器。如果提交,会同时删除数据库中的数据。

      persist():这个方法与save方法类似,但是区别在于这个方法不会产生标识。

      clear():清空session容器。

      flush():将session中的对象更新到数据库,并不会清空session容器。

      close():关闭session容器,关闭之前不会更新。

     2、SessionFactory接口:负责初始化Hibernate,它充当数据存储源的代理,并使用工厂模式负责创建Session对象。注意:SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够了,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

     3、Configuration接口:负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory。

     4、Transaction接口:该接口负责事务相关的操作,开发人员也可以设计编写自己的底层事务处理代码。

     5、Query和Criteria接口:负责执行各种数据库查询。它可以使用HQL(Hibernate Query Language)语言或SQL语句两种表达方式。

     Hibernate对象有三种状态:

     1、瞬时态(Transient):瞬时对象和脱管对象也称为VO(Value Object)。由new开辟内存空间的Java对象,如果没有变量对该对象进行引用,它将被JVM回收。处于瞬时态的对象在内存中孤立存在,它是携带信息的载体,但是不与数据库的数据存在任何关联关系。

     2、持久态(Persistent):处于持久态的对象也称为PO(Persistence Object),处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。若这两个条件都不满足,该对象将变成瞬时态的对象。当只满足第一个条件时,该对象将变成脱管态对象。

     3、脱管态(Detached):当与某持久对象关联的Session被关闭后,该持久对象转变为脱管对象。脱管对象特点:本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收。但是它比瞬时对象多了一个数据库记录标识值。

     这三种状态在某些情况下可以相互转换:

     1、瞬时态->持久态:通过session的save()或saveOrUpdate()方法将瞬时态对象与数据库相关联,并将数据对应地插入到数据库中,此时该瞬时对象转变成持久化对象。

     2、持久态->瞬时态:挡在数据库中有对应记录的一个持久态的对象使用delete()方法时将进行此种转换,因为数据库中的对应数据已被删除,该对象不再与数据库的记录关联,该对象不再满足持久态对象的条件。

     3、持久态->脱管态:当一个处于持久态的对象执行session的close()、clear()或evict()之后,进行此种变换,此时它虽然具有数据库标识值,但它已不再持久化层的管理之下。

     4、脱管态->持久态:脱管态的对象呗重新关联到session上时,进行这种变换。脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法转变成持久对象。

     5、脱管态->瞬时态:处于脱管态的对象执行session的delete()方法后,可变成瞬时态的对象。

     Hibernate的配置文件:

     1、配置hibernate.cfg.xml:Hibernate运行时需要获取一些数据库的基本信息,包括数据库URL、数据库用户名、数据库用户密码、数据库JDBC驱动类和数据库dialect等。Hibernate支持以XML格式(hibernate.cfg.xml,比较常用)和properties文件两种方式配置数据库的基本信息。

     2、配置.hbm.xml:HIbernate采用XML格式的文件来指定对象到数据库之间的映射,在系统运行的时候,Hibernate会根据这些配置来生成对应的SQL语句。这些配置文件以.hbm.xml结尾,一般一个POJO类对应一个.hbm.xml文件。

     面试题:

     1、SessionFactory接口是重量级的对象,因此一般一个项目只需要一个SessionFactory,针对多个数据库存储源的情况,可使用多个,一个SessionFactory对象对应一个数据库存储源。Session的load()方法用于加载持久化对象,而不是SessionFactory对象。

     2、使用new User()创建user对象,该对象时瞬时态对象,通过session的save()或saveOrUpdate()方法将瞬时态对象与数据库相关联,并将数据对应地插入到数据库中,此时该瞬时态对象转变成持久化对象。当一个处于持久态的对象执行session的close()、clear()或evict()之后,转换为脱管态。

     3、面向关系概念中的表、表中的行、表中的字段分别对应面向对象的类、对象、属性。

     4、Hibernate工作原理:

     (1)读取并解析配置文件,例如主配置hibernate.cfg.xml。

     (2)读取并解析映射信息,例如.hbm.xml后缀的文件,创建SessionFactory。

     (3)打开会话Session。

     (4)创建事务Transaction。

     (5)进行持久化操作,例如insert、update和delete操作。

     (6)提交事务。

     (7)关闭Session。

     (8)关闭SessionFactory。

    5、与JDBC相比,Hibernate主要优点:

    (1)可以应用在任何使用JDBC的场合。

    (2)对JDBC进行轻量级封装,使Java程序员使用面向对象的编程方法操作数据库。

    (3)对不同的数据库的可移植性比JDBC好。

    (4)具有缓存机制,提供一级缓存和二级缓存。

    (5)提供方便可用HQL数据库查询语言。

    6、Hibernate中三种常见的关联关系:

    (1)一对多(或多对一)关联关系:例如“用户表”和“部门表”之间的关系,“用户”与“部门”是多对一关系,“部门”和“用户”是一对多关系。“多”的一方的.hbm.xml可使用<many-to-one>元素定义,“一”的一方的.hbm.xml可使用<one-to-many>和<set>元素定义。

    (2)一对一关联关系:例如“用户表”和“用户附加信息表”之间的关系,即一个表的主键关联另一个表的主键的情况。在.hbm.xml文件中使用<one-to-one>元素定义。

    (3)多对多关联关系:例如“用户表”和“角色表”之间(当允许一个用户具有多个角色时)的关联关系,在数据库中一般使用关联表来体现这种关系。在.hbm.xml文件中使用<many-to-many>和<set>元素定义。

    7、HQL与SQL的最大区别:HQL是一种查询语言,并不支持insert、update和delete等语句,另外它是面向对象的。HQL面向对象,而SQL操纵关系数据库;HQL仅用于查询数据,不支持insert、update和delete语句。

    8、在Hibernate中,load()和get()两种加载方法的区别:

    (1)如果数据库没有userName对应的对象时,使用get()方法加载,会返回null。如果使用load()方法加载,会返回一个代理对象,如果后面的代码对该对象操作时,会抛出异常。

    (2)load()方法支持延迟加载,只有在用到需要取出的对象时才真正进行数据库查询,而get()方法不支持延迟加载。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值