学完了ssh,从Hibernate中提取出了下面一些知识点,分享一下,同时欢迎朋友们帮助补充。
一、 Hibernate概念及功能
Hibernate是开放源代码的对象/关系映射框架,可以将对象与对象关系映射至关系数据库,而不用手动在数据库中创建表。Hibernate封装了通过JDBC访问数据库的操作,向上层提供了面向对象的访问数据API,是应用程序和数据库之间的桥梁。
Hibernate是一种轻量级的框架,可以开发各种java应用程序。在基于MVC设计模式的java Web应用中,Hibernate可以作为数据库访问层。
二、Hibernate的核心组件以及运行过程
hibernate的运行过程(各组件之间的调用关系):应用程序先调用Configuration类,该类负责读取配置文件和映射文件,并将读取的信息生成一个SessionFactory对象,SessionFactory对象生成一个Session对象,Session对象生成Transaction对象。get()、load()、save()、update()等方法均由Session对象提供。
1. Configuration是Hibernate的一个入口,在新建一个Configuration的实例时,Hibernate会在classPath或WEB-INF/classes目录中查找配置文件。如果存在配置文件,加载其内容,如果不存在,抛异常。
2. SessionFactory产生Session的实例。
3. Session用来操作持久化对象,通过get()、 set() 、update() 、save()等方法完成对持久化对象(PO)的操作
4. Query用来操作持久化对象的查询操作,可以控制查询如何执行,.list() .Iterator()
Iterator iter = session.createQuery("from User").iterate();
List list = session.createQuery("from User").list();
5. Transaction使用Hibernate必须显式调用
6. 配置文件:配置文件中配置连接数据库的参数,以及指定映射文件
7. 映射文件:映射持久化对象与数据库表,映射PO之间的关系与表之间的关系,映射PO属性与表字段。每个表对应一个扩展名为.hbm.xml的映射文件。需要掌握映射文件的常用标签元素<class> 、 <id> 、 <property> 、 <generator> 、 <one-to-one> 、 <man-to-one> ,以及一些属性inverse、cascade、lazy等等。
三、持久化对象的状态
1. 持久化?
持久化是指通过将数据保存到能够长久保存的设备中,以达到反复利用的目的,这称为持久化。这里指的是保存到数据库中。
2.持久化对象
持久化对象,我理解的就是和数据库表和映射文件对应的javaBean。里面有属性值,有get() 、set()方法。
3.三种状态
从图中可以看出,
load()、get()、find()、iterate()方法返回的对象总是处于持久化状态。
save()、saveOrUpdate()方法把瞬时状态的对象变成持久化状态。
delete() 把持久化状态的对象编程瞬时状态。
close()、evict()、clear()方法把持久化状态的对象变成离线状态。
update()、saveOrUpdate()、lock()方法把离线状态的对象编程持久化状态。
四、关系映射
hibernate的映射关系之前的博客中已经讲过了。因为Hibernate的核心功能是完成持久化对象和数据库的映射,所以,Hibernate映射是比较重要的,映射关系通过配置映射文件来完成。
五、查询语句
Hibernate的数据查询主要有三种方式,HQL(Hibernate Query Language),Criteria Query, Native SQL。其中,HQL的功能要更强大一些,比较常用。HQL与Sql类似,只是Sql针对表中字段进行查询,而HQL针对持久化对象。
六、 优化策略——缓存
Hibernate的缓存,前面的博客写过了。Hibernate中的缓存分为两层,一级缓存、二级缓存。
一级缓存同二级缓存的比较:
1. 生命周期
一级缓存通过Session实现,生命周期同Session一样;二级缓存生命周期同SessionFactory一样,查询缓存生命周期同SessionFactory一样。
2. 缓存的对象
一级缓存缓存实体对象,二级缓存缓存指定的实体对象,查询缓存只缓存实体对象的id和普通属性字段
3. 配置使用(配置步骤在前面的博客中)
一级缓存不用配置,也无法禁用,它相当于session的一个map,当执行save()、load()等方法时,数据就会自动存入一级缓存中。
二级 缓存需要配置,可以开启和禁用。
查询缓存需要配置,可以开启和禁用。
七、主键生成策略
assigned:自定义主键。例如,我们注册邮箱时,每次申请的用户名就是自定义的主键。
uuid:是系统产生的一串随机无序字符串,为String类型,
native:是数据库产生的自增数据,为int类型。
这里只介绍了三种主键生成策略,其实,具体采用哪种策略,要依据程序需要以及所用数据库来定。参考文章:
http://www.blogjava.net/huxiaowi/archive/2010/07/29/327404.html
八、几个重要属性
inverse:标记由哪一方来维护关联关系。用在双项关联中。inverse设置为true时,表示关联关系由对方完成。
cascade:级联操作,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作。取值all表示所有情况下都执行级联操作。取值none表示所有情况下都不执行级联操作。取值save-update表示在保存和更新的时候执行级联操作。取值delete时,在删除时执行级联操作。cascade只影响添加、删除和修改操作。
lazy:延迟加载。只在需要用到的情况下,才发出select语句查询需要的对象。