Hibernate学习笔记之体系结构的理解


Hibernate是什么?个人理解是能让对象与数据库表一一映射的中间层(ORM体系),模块层,它能省去一些增删查改等简单sql语句,省去使用JDBC时sql语句的拼接和查询结果

集后对object的属性的setter调用.


ORM:对象角色建模。用来自动映射数据,是对JDBC进行对象轻型封装。


Hibernate与JDBC 


JDBC与Hibenate性能比较: 


1、简单的对象操作的增删改查,那么hibernate就比较的方便,因为hibernate 
封装了这些简单的操作,只要调用相应的find,save等方法而不用操作SQL 2、复杂的SQL操作使用jdbc方便。 
3、jdbc效率比hibernate要高,尤其在大规模的数据多表的联合查询等方面 4、取百家之所长;hibernate可以和jdbc结合着使用。

  
JDBC的缺点: 


1、所有的SQL 都要手编,任务繁重 
2、当从数据库取得数据存到Bean对象时,需要手动set 3、过多的try..catch处理 
4、过多考虑Connection等是否关闭  


Hibernate优点: 


1、用户不用操作SQL语句 
2、 获取数据Bean方便,每个表对应映射一个Bean类,取得数据时只需转换成 对应Bean类型即可,如User user = (User)session.get(User.class, id) 
    存储数据时会根据映射文件自动将对象中各属性转换并存到表格中相应字   
段。 
3、不用try..catch处理,不用考虑Connection等是否关闭,只需将Session关闭, 
关闭Session只是将Connection归还到连接池,并没有关闭Connection。



Hibernate基本接口 


Configuration接口: 
此对象用于配置并启动Hibernate,实例一个此对象来指定对象—关系映射文件路径,然后创建一个SessionFactory实例  


SessionFactory接口: 
一个实例对应一个数据存储源,应用从SessionFactory中获得Session实例。SessionFactory是重量级的,所以不能随意创建和销毁它的实例。访问一个数据库只创建一个SessionFactory实例,访问多个数据库就要创建多个SessionFactory实例。确保SessionFactory与每一个数据库一对一关系。  


Session接口: 
提供持久化相关的操作。如添加、删除、加载、查询等。它是轻量级的, 所以不需消耗太多资源。可以经常创建或销毁一个Session实例。  


Query接口: 
Hibernate查询的接口,用于向数据库查询对象,执行查询操作。  
Criteria接口: 执行动态查询  


Transaction接口: 
是Hibernate的数据库事务接口,对底层的事务接口(JDBC、JTA)作了封装,在Hibernate应用中不直接访问底层事务接口。而且通过Transaction来访问。JTA是 Java Transaction API


Hibernate缓存 


session缓存产生: 
一个Java对象被创建将被分配一定堆内存空间,如果这个对象没有被任何变量引用则结束生命周期,内存将回收。因此希望这个对象一直处于生命周期则必须保证至少有一个变量引用它,或某个JAVA集合中存放了这个对象的引用。Hibernate中,在Session接口的实现类SessionImpl中定义了一系列的Java集合,这些集合构成了Session的缓存。SessionImpl中通过Map处理put一些Java集合。 

 比如当用户信息提交(User类),调用Session的save(User)方法时,此时并没有真正插入到数据库(事务还没提交),User对象被加到Session的缓存。User对象仍处于生命周期。当调用Session 的load()方法时,Session先判断缓存中是否还有这个对象,如果存在,则不再查找数据库。可见Session缓存可以减少数据库的操作次数,从而提高系统性能。  


session缓存清除: 
1、当事务进行commit后,hibernate将调用flush先清理缓存,再执行save(User)对应的insert语句。 
2、手动调用flush时,比如find找到一条记录后同时会存一份到缓存,下次再找这条记录时会先从缓存中找到而不去查找数据库,此时用flush可以清除缓存的记录而强迫去查找数据库。 
3、调用Session的close()方法时,Session的缓存全部清空,User对象生命结束, 比如save(User)后再调用close,将清除缓存,再load时缓存中找不到,数据库中也找不到。因为并没有提交事务 
 
hibernate提供二个级别的缓存。第一级缓存是Session缓存,第二级缓存是一个可插拔的缓存插件。  


一级缓存 
当应用程序调用Session的save(),  update(),  saveUpdate(),  load(),  get(),  find()以及查询接口的list(),  iterate(),  filter()方法时,若在一级缓存中还存在相应的对象,hibernate会把此对象加入到一级缓存。Session另外提供两个清理缓存的方法: 
evict(Object 0)用于从缓存中清除参数指定的持久化对象 clear()用于清空缓存中所有持久化对象  


可插拔二级缓存 
二级缓存由SessionFactory负责管理。由于SessionFactory在hibernate启用时产生,整个生命周期和应用程序进程对应。因此二级缓存是进程范围或群集范围的缓存


 比如当用户信息提交(User类),调用Session的save(User)方法时,此时并没有真正插入到数据库(事务还没提交),User对象被加到Session的缓存。User对象仍处于生命周期。当调用Session 的load()方法时,Session先判断缓存中是否还有这个对象,如果存在,则不再查找数据库。可见Session缓存可以减少数据库的操作次数,从而提高系统性能。  
session缓存清除: 
1、当事务进行commit后,hibernate将调用flush先清理缓存,再执行save(User)对应的insert语句。 
2、手动调用flush时,比如find找到一条记录后同时会存一份到缓存,下次再找这条记录时会先从缓存中找到而不去查找数据库,此时用flush可以清除缓存的记录而强迫去查找数据库。 
3、调用Session的close()方法时,Session的缓存全部清空,User对象生命结束, 比如save(User)后再调用close,将清除缓存,再load时缓存中找不到,数据库中也找不到。因为并没有提交事务 
 
 
hibernate提供二个级别的缓存。第一级缓存是Session缓存,第二级缓存是一个可插拔的缓存插件。  
一级缓存 
当应用程序调用Session的save(),  update(),  saveUpdate(),  load(),  get(),  find()以及查询接口的list(),  iterate(),  filter()方法时,若在一级缓存中还存在相应的对象,hibernate会把此对象加入到一级缓存。Session另外提供两个清理缓存的方法: 
evict(Object 0)用于从缓存中清除参数指定的持久化对象 clear()用于清空缓存中所有持久化对象  
可插拔二级缓存 
二级缓存由SessionFactory负责管理。由于SessionFactory在hibernate启用时产生,整个生命周期和应用程序进程对应。因此二级缓存是进程范围或群集范围的缓存   



Hibernate事务 


Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置: 
如果你什么都不配置,默认情况下使用JDBCTransaction,如果你配置为:  
 

hibernate.transaction.factory_class 
net.sf.hibernate.transaction.JTATransactionFactory 

 
 将使用JTATransaction  


JTA事务与JDBC事务区别: 


1、JTA提供了跨Session的事务管理能力,这是与JDBCTransaction最大的差异。 JDBC 事务由Connection管理,事务周期限于Connection的生命周期之内。 

2、JTA事务管理由JTA容器实现,JTA容器对当前加入事务的众多Connection进行调度,JTA事务横跨多个Session。需要注意的是,参与JTA事务的 Connection需避免对事务管理进行干涉,如果采用JTA Transaction,就不应该再调用Hibernate的Transaction功能。 


JTA事务 
Java Transaction API(Java事务API)。JTA Transaction是指由J2EE Transaction manager去管理的事务。其最大的特点是调用UserTransaction接口的begin,commit和rollback方法来完成事务范围的界定,事务的提交和回滚。JTA Transaction可以实现同一事务对应不同的数据库,但它仍无法实现事务的嵌套


JDBC事务 


Hibernate的JDBCTransaction根本就是conn.commit而已,只不过在Hibernate中,Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以JDBC不写commit也没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应  
Hibernate对于JDBC事务的操作非常简单,如下: 

session=sessionFactory.openSession(); 
Transaction tx= session.beginTransaction(); 
session.save(); 
tx.commit(); 
session.close(); 


JDBC与JTA事务对比 


1、Hibernate Transaction是从Session中获得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,这完全符合JDBC的Transaction的操作顺序 

2、JTA的Transactioin操作顺序相反。 JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于学习Hibernate,我可以为你提供一些指导。Hibernate是一个Java持久化框架,用于将Java对象映射到关系数据库中。它简化了与数据库的交互,提供了ORM(对象关系映射)的功能。 如果你想学习Hibernate,以下是一些建议的步骤: 1. 了解基本概念:开始之前,建议你先了解一些Hibernate的基本概念,例如持久化、实体类、会话(Session)等。这将帮助你更好地理解Hibernate的工作原理。 2. 学习Hibernate配置:Hibernate使用一个配置文件来连接数据库和定义映射关系。你可以学习如何配置Hibernate以适应你的项目需求。这包括数据库连接配置、实体类映射等。 3. 学习Hibernate实体映射:Hibernate通过注解或XML文件将Java实体类映射到关系数据库表中。你可以学习如何使用注解或XML文件来定义实体类的映射。 4. 学习Hibernate查询语言(HQL):HQL是一种类似于SQL的查询语言,用于对数据库进行查询操作。学习如何使用HQL进行查询和操作数据库是很重要的。 5. 学习Hibernate事务管理:事务管理是在处理数据库操作时非常重要的一部分。学习如何使用Hibernate进行事务管理,包括开启事务、提交事务、回滚事务等。 6. 实践项目:最好的学习方法是通过实际项目来应用所学的知识。尝试在一个小型项目中使用Hibernate来进行数据库操作,这将帮助你更好地理解和掌握Hibernate的使用。 除了上述步骤,还有很多其他方面的内容可以学习,例如缓存管理、性能优化等。希望这些步骤能够帮助你入门Hibernate!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值