`
灬烟丶醉
  • 浏览: 9499 次
  • 性别: 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 配置各种数据库

    Hibernate 配置各种数据库 Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等...

    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-...

    Hibernate入门到精通

    "Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...

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

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

    hibernate学习资料大全

    【hibernate学习资料大全】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。这个压缩包包含了丰富的Hibernate学习资源,旨在帮助开发者深入理解和熟练掌握这一强大的...

    Hibernate-extensions 完整安装包

    《Hibernate-Extensions全面指南》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要...

    hibernate-release-4.1.4

    【描述】中的"hibernate的jar包"指的是Hibernate框架的运行库文件,这些JAR文件包含了Hibernate的所有核心API、实现和依赖库,如Hibernate Commons Annotations、Hibernate EntityManager、Hibernate Core等。...

    hibernate基础jar包

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的编程工作。这个压缩包包含了Hibernate的基础jar包,这些jar文件是开发Hibernate应用所...

    HibernateTools-3.2.4

    HibernateTools是Java开发人员在使用Hibernate ORM框架时的有力辅助工具集,主要目的是为了提高开发效率,简化数据库操作。在HibernateTools 3.2.4版本中,它包含了一系列的特性与插件,以支持更便捷地进行对象关系...

    kingbaseV8 hibernate jdbc 驱动

    在Java开发环境中,与KingbaseV8数据库进行交互通常会用到Hibernate框架和JDBC驱动。 Hibernate是一个优秀的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作,通过将Java对象与数据库表进行映射,...

    hibernate3全部jar包:hibernate3.jar.zip 下载

    Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。这个“hibernate3全部jar包:hibernate3.jar.zip”包含了所有必要的库文件,方便用户一次性下载并...

    Hibernate3的依赖包

    Hibernate3是一个广泛使用的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作,极大地简化了Java应用程序与数据库之间的交互。在这个"Hibernate3的依赖包"中,包含了运行Hibernate3应用...

    hibernate和MySQL的jar

    标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...

    hibernate4.3完整jar包

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

    Hibernate 中文api 等学习资料

    标题"Hibernate 中文api 等学习资料"暗示了这是一组针对Hibernate ORM框架的中文学习资源,包括API文档和其他指南,旨在帮助用户更好地理解和使用Hibernate。 描述中的"hibernate orm框架api中文文档,学习资料,...

    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入门jar包

    Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使开发者可以更加专注于业务逻辑而不是数据访问层的实现。本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之...

    hibernate3必要jar包

    Hibernate3 是一个非常重要的Java持久化框架,它允许开发者将对象模型与数据库关系模型进行映射,从而简化了数据存取的过程。这个压缩包“hibernate3必要jar包”显然是针对Hibernate3版本的,已经去除了冗余的库文件...

    hibernate_3.2官方开发包

    Hibernate 是一个著名的开源对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据持久化方式,使得在Java应用程序中操作数据库变得更加简单。这个“hibernate_3.2官方开发包”包含了所有你需要开发基于...

    hibernate需要的10个jar

    在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。当涉及到Hibernate项目时,为了使其正常运行,通常需要一系列的JAR(Java ...

Global site tag (gtag.js) - Google Analytics