hibernate框架学习心得(一)

时间:2022-01-31 16:24:21

反复地把hibernate的内容学习了两遍,有了一点感觉,就把心得体会记录在这里,以备今后复习。

一、基本知识

hibernate是一个ormapping的框架(object-relation-mapping),也就是用于建立对象与数据库表之间关系的一个框架,它的优点在于:(1)操作简单;(2)比较牛的缓存机制:一级缓存、二级缓存、查询缓存;(3)移植性比较好,而缺点是:(1)由于它可以看作是对JDBC的一层封装,因此hibernate具体发出怎样的SQL语句其实程序员是无法控制的,这样带来的一个问题就是很有可能框架发出的SQL语句并不能达到比较令人满意的效率,因此,如何发出尽量少的SQL语句就成为操作hibernate框架的程序员在提升效率的时候需要考虑的问题;(2)当数据量非常非常大的时候,用hibernate就会力不从心了。
使用hibernate的时候需要做四件事情,第一,写配置文件hibernate.cfg.xml,这个配置文件负责建立与数据库的连接,因此我们会发现在这里面保存的都是当前应用使用的数据库的相关信息;第二,写持久化类,所谓持久化类,可以认为是javaweb中的javabean,它用来和数据库中的表对应;第三,写映射文件*.hbm.xml,这个xml文件描述了持久化类中的属性和数据库表中的字段的对应关系;第四,一定要记得在配置文件中注册持久化类哦,例如:

<mapping resource="com/tt/hibernate/domain/Student.hbm.xml" />

二、对象的状态

对于hibernate中的一个持久化类,都会处在如下三个状态中的一个:临时状态、持久化状态、脱管状态。当我们new出一个对象的时候,这个对象是处在临时状态,当调用session.save()/session.update()/session.get()方法的时候,则变为持久化状态,最后,当我们关闭session的时候,即调用session.close(),或者使用session.clear()/session.evict()清空缓存的时候,则对象变为脱管状态。

三、关系操作

用过关系型数据库我们都会知道,在数据库表的设计当中涉及到一对多、多对多等多表设计的问题,在hibernate中同样存在这个现象,但是在hibernate中多表设计是通过面向对象的思想来体现的。
一对多:按照关系型数据库的设计思想,一对多的设计应该通过多的一方建立关系,如班级表和学生表就是一对多的关系,那么我们就可以在学生表中保存每个学生的班级信息,然而在hibernate中不是这样的,它会在班级类中设置一个set,用来存放该班级中的所有学生,查找的时候则通过班级来找到该班级中的学生
多对多:在关系型数据库中通过维护第三方表来维护两表之间的关系,在hibernate中则在两个类中都保存对方的set,如课程表和学生表,则在课程类里保存类型为学生的set集合,在学生类里保存类型为课程的set集合。

四、session

(1)session的产生

在hibernate中,session的产生方式有两种,分别是:sessionFactory.openSession和sessionFactory.getCurrentSession,对于sessionFactory.openSession来说,每次调用都会创建一个新的session,而出于安全性的考虑我们通常会使用第二种方式来调用session,当我们调用sessionFactory.getCurrentSession方法时,框架首先会判断当前线程中是否有session,若有,则直接取出现成的session供使用,若没有,则会创建一个新的session,并将其加入到当前threadlocal中去,用户从threadlocal中获取并使用。
sessionFactory.getCurrentSession的使用方法:
1、在hibernate的配置文件中配置如下:

     <propertyname="current_session_context_class">
thread
</property>

2、不需要写session.close方法,在事务提交的时候会自动关闭(由hibernate内部完成)
3、crud都需要事务
1、因为是一个线程,所以整个方法中只有一个session和一个事务
2、保证了整个业务操作的安全性

(2)session的缓存(一级缓存)

1、生命周期就是session的生命周期
2、一级缓存存放的数据都是私有数据
把session存放在threadlocal中,不同的线程是不能访问的,所以保证了数据的安全性
3、怎么样把数据存放到一级缓存中
利用session.save/update/load/get方法都可以存放在一级缓存中
4、利用session.get/load方法可以把数据从一级缓存中取出
5、session.evict方法可以把一个对象从一级缓存中清空
6、利用session.clear方法可以把session中的所有的数据清空
7、利用session.Refresh方法把数据库中的数据同步到缓存中
8、session.flush
在session的缓存内部,会去检查所有的持久化对象
1、如果一个持久化对象没有ID值,则会发出insert语句
2、如果一个持久化对象有ID值,则会去检查快照进行对比,如果一样,则什么都不做,如果不一样,则发出update语句
3、检查所有的持久化对象是否有关联对象
检查关联对象的级联操作
检查关联对象的关系操作
(注:session.flush只会将缓存中的数据保存到数据库中,而不会清空缓存)
9、批量操作