`
灬烟丶醉
  • 浏览: 9323 次
  • 性别: Icon_minigender_1
  • 来自: 广东
社区版块
存档分类
最新评论

Hibernate

阅读更多

     不喜勿喷..麻烦各位看到错误了评论一下..以便改正..

Hibernate

什么是Hibernate

 Hibernate是一个开放源代码的orm(Object  Relation mapping  对象关系映射框架,主要是对jdbc进行了轻量级的封装;

HibernateIbatis的区别以及优缺点

Hibernateibatis的区别:

1、ibatassql语句需要自己手动写,而hibernate能够在程序运行时自动生成hibernate还能自动创表;

2、iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比 Hibernate要大很多;例如修改了某个表里面的结构,hibernate只要修改映射文件和javaBean;而ibatis要一一去修改;

Hibernate

Hibernate的优点:

1、SQL语句都被封装,开发效率高;

2、性能比较好,可以很好的映射各种关系型数据库,可移植性高;

Hibernate的缺点:

1、不是很灵活,不容易被控制;

2、对持久层数据封装过于完整,无法对SQL进行优化

3、如果数据库的表过多,关系也很复杂,hibernate就会变得很难维护;

 Ibatis:

Ibatis的优点:

1、使用较灵活,更好被控制;

2、易于学习,易于使用,通过文档和源代码,便可知晓它的设计思路和实现;

Ibatis的缺点:

1、sql需要自己写

2、对象关系映射,工具支持较少

Hibernate的核心接口和作用

六大顶级接口:Session、SessionFactory、Transaction、Query、Criteria、Configuration
六大接口的作用

Session

主要是对持久化对象的操作和对数据库的访问,以及常见的SQL语句,需要注意的是session它的线程不是安全的;

SessionFactory

主要是对session进行实例化,可以创建session对象,

Transaction

主要是对事物的控制,这个接口是可选的,可以自己写事物

QueryCriteria: 

主要是对数据库的各种查询访问,可以使用HQLSQL这俩中语言;

Configuration:

Configuration接口负责配置并启动Hibernate,创建SessionFactory对象;并且定位映射文档位置、读取配置,然后实例化SessionFactory

Hibernate三种状态

三种状态的简介:

Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VOValue Object)。 

三种状态的区分:

持久态[持久化对象 po]

处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识;可以通过session中的delete来让它成为一个瞬时态

托管态[值对象 vo]

当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

 

瞬时态[值对象 vo]:

不和数据库的数据有任何关联关系,但是可以通过session中的save或者saveOrUpdate方法将瞬时态转为持久态

 

Java术语

Po(persistant object) 持久化对象

Po中应该不包含任何对数据库的操作

PoJo(plain ordinary java object) 简单无规则java对象

最基础的java bean类,里面只有属性字段以及getset方法

Vo(value object) 值对象

业务层之间的数据传递,PO一样也是仅仅包含数据而已

 

Bo(business object) 业务对象

通过调用数据访问对象的方法,结合持久化对象和值对象对数据库进行处理

 

Dao(data access object) 数据访问对象

DAO中包含了各种数据库的操作方法通常和持久化对象结合使用,通过它的方法,结合持久化对象对数据库进行相关的操作

dto(Data Transfer Object)数据传输对象

主要用于远程调用等需要大量传输对象的地方。

 

Loadget方法的区别相同点:

Getload都是通过id来查询,并且查询出来是持久状态;

不同点:

如果找不到符合条件的记录,get方法返回null,load方法抛出异常;

当数据不变时,get会查询一级缓存、二级缓存,若是在缓存中不存在,则会去查询数据库;

load是查询一级缓存后,若是在一级缓存中没有找到对应数据,则会创建一个代理对象,然后根据这个代理对象id去查找二级缓存和数据库;

List iterator的区别

相同点:

他们查询出来都是结果集;

不同点:

返回的类型不一样,list()返回List, iterate()返回Iterator,
 list对缓存只写不读,然而iterator却充分的利用到了写进去的缓存;

若是缓存区中没有记录,使用iterator访问数据库会出现N+1条查询语句,而list始终都是一条;

如果SQL语句不变同时数据也没被改变的情况下,list直接取的缓存而不用再连接数据库进行检索

iterator方法用n+1此来获得所有数据信息同时放到缓存中,不管SQL语句变没变始终会发送一

条获得IDSQL语句,然后根据ID查找缓存,如果没有则再发送一条SQL语句获得该对象;

 

三大常用查询方式

HQL

什么是HQL

Hql (Hibernate query language) hibernate提供了灵活的查询方式,和sql很相似,hql采用面向对象的查询方式

Hql查询

HQLhibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点;

对象化查询Criteria方法:

面向对象操作,易读;

sql查询

用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名

关联关系

关联关系本质

关联关系是指对象模型在内存中的一个或者多个引用

一对多关联

<many-to-one>会在多的一端加入一个外键,指向一的一端。

使用:这个外键由<many-to-one>标签中的column属性定义,如果不写此属性,默认外键与实体的属性一致

一对一关联

是多对一关联映射的特例,也可以说是一个特殊的多对一;

使用:采用<many-to-one>标签,指定多的一端unique=true(对配置的唯一性约束字段进行唯一性检查),这样可以限制 多的一端的多重性为一。

多对多关联

它的映射需要借助于第三方表,也可以说是他们之间的中间表;

使用:<key>column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致

缓存

内置缓存

Session的缓存是内置的,不能被卸载,也被称为Hibernate的一级缓存,内部是封装的一个map

外置缓存

SessionFactory的外置缓存,借助于第三方插件(例如:jbossCacheEHCache)来进行工作;默认情况下是不启用的;

缓存级别

一级缓存:session

一级缓存是由Session提供的,所以它只存在于Session的生命周期中,一级缓存是由Session提供的,所以它只存在于Session的生命周期中,如果session 存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候该Session所管理的一级缓存也会立即被清除;

二级缓存:sessionFactory

二级缓存是全局缓存;缓存可以简单的看成一个Map,通过key在缓存里面找value

缓存范围

事务范围:

事务范围的缓存只能被当前的事务访问,而且每个事务都有各自的缓存空间,缓存内的数据通常采用相互关联的对象形式存在,事务范围的缓存生命周期是依赖于事务的生命周期,只有当事务结束时,缓存才会消失;

应用范围:

应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束

集群范围:

 在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点

事务的隔离级别

Hibernate使用隔离级别:

Hibernate的配置文件中可以显示的配置数据库事务隔离级别。每一个隔离级别用一个整数表示:

8 - Serializable 串行化
4 - Repeatable Read 可重复读
2 - Read Commited 可读已提交
1 - Read Uncommited 可读未提交

 

Serializable 串行化

使用串行化隔离级别后,必须等前一个事务结束后,这一个事务才能开始;

Repeatable Read 可重复读

当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行

 

Read Commited 可读已提交

 它只读取已提交的数据,换句话说就是,任何未提交的数据它都会置之不理,直到数据提交为止;

Read Uncommited 可读未提交

一个事务读到另一个事务还没有提交的数据。

查询缓存

锁的作用

保证些数据在某个操作过程中不会被外界修改

乐观锁:

乐观锁的原理:

读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一

乐观锁的作用:

大多是基于数据版本(Version)记录机制实现

悲观锁:

悲观锁的原理:

基于数据库的锁机制实现,适合于当前数据库的悲观锁不一定适合其他数据库,每一个数据库都有它自己的悲观锁;

悲观锁的作用:

它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态

,当某些数据被悲观锁锁定后,这些数据做删除、修改不能进行;

怎样避免n+1问题

1、使用二级缓存可以避免n+1

2、使用fetch="join",让它一次性加载数据,这样懒加载就失去了意义,也就不会出现n+1问题;

3、修改lazy 属性,lazy默认是true(true为懒加载);将它的属性改为:lazy="false",这样就不会出现n+1问题;biwpn

 

 

 

 

2
2
分享到:
评论
8 楼 灬烟丶醉 2013-10-17  
  好吧...
7 楼 white_crucifix 2013-10-17  
只是讨论一下重量级的含义吧,到底hibernate重不重也是相对的,去和ejb比那肯定是轻的,要去和后来的ibatis或者mybatis比当然后者更轻
6 楼 灬烟丶醉 2013-10-17  
  弱弱的问句,你的重量级在哪里看到的..能不能给个网址...
5 楼 white_crucifix 2013-10-17  
一般来说,轻量级表示封装少,接近原生。而越接近原生的封装,性能就越好。hibernate就是这么一个经典的重量型框架,是一个强面向对象的框架,在最上层的代码走到sql语句执行的过程中,有大量的事情要做,包括反射,这样必然性能要比直接使用sql来的慢很多,当然,要在大数据量的情况下才看得出。hibernate最初发明的时候并不是为了性能而生,只是为了解决软件复杂度和耦合度,匹配oo思想,当然发展至今越来越复杂。
4 楼 灬烟丶醉 2013-10-16  
  那也不一定..轻量级框架侧重于减小开发的复杂度,相应的它的处理能力便有所减弱,作为重量级框架EJB框架则强调高可伸缩性,适合与开发大型企业应用,我就知道这些了..若还是不明..搜goole、搜baidu吧..
3 楼 white_crucifix 2013-10-16  
话说不是越重的东西性能越差么
2 楼 灬烟丶醉 2013-10-16  
如果数据量很大的话,Hibernate会支撑不住或者说效率很低;所以说她是个轻量级的,大数据量的话我介意使用jdbc + 存储过程..
1 楼 white_crucifix 2013-10-16  
轻量级的封装

相关推荐

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...

    最新版本的Struts2+Spring4+Hibernate4框架整合

    项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 二、 项目目的: 整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + ...

    hibernate.5.1.0.jar全部

    包含hibernate所有所需jar包还有一些其他包日志包、jpa支持包等: 列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0....

    Hibernate连接SQLite配置说明和方言代码

    Hibernate连接SQLite配置步骤: 1、添加SQLite库: 1.1、将两个jar包:com.zy.hibernate.dialect.SQLiteDialect.jar、sqlite-jdbc-3.7.2.jar拷贝到“\WEB-INF\lib”文件夹下; 2、配置hibernate: 2.1、将...

    Java Persistence WIth Hibernate 2nd

    Manning出版 Java Persistence With Hibernate 第二版 清晰pdf Hibernate, an open source project that is almost 15 years old. In a recent poll, Hibernate was among the top five tools used by many Java ...

    Could not roll back Hibernate transaction.doc

    Hibernate事务回滚失败解决方案 Hibernate是一个流行的Java持久层框架,它提供了对数据库的操作和事务管理机制。然而,在使用Hibernate时,可能会遇到事务回滚失败的问题,本文将详细介绍该问题的原因和解决方法。 ...

    hibernate-testjar包

    hibernate

    论坛系统项目(Struts 2+Hibernate+Spring实现)

    论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...

    hibernate 资料hibernate 资料hibernate 资料

    hibernate 资料hibernate 资料hibernate 资料hibernate 资料

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate...

    Hibernate连表查询 Hibernate连表查询

    Hibernate连表查询 Hibernate连表查询

    java persistence with hibernate

    Java Persistence with Hibernate is the new bible of Hibernate. As a major revision of the popular Hibernate in Action, it builds on the same single example application to introduce and explain the ...

    hibernate关系映射网址

    hibernate

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip)

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate4.3完整jar包

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate Hibernate5 讲义 PDF

    hibernate5 hibernate PDF 讲义 动力 hibernate ssh hibernate5 节点

    hibernate annotation hibernate3

    hibernate annotation hibernate3

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    深入浅出Hibernate(PDF)第一部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    Hibernate对象的生命周期

    Hibernate对象的生命周期 Hibernate对象的生命周期 Hibernate对象的生命周期

Global site tag (gtag.js) - Google Analytics