hibernate学习小结
学习之余,把hibernate的知识点稍作小结。我们知道,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使得我们可以很容易地使用对象编程思维来访问数据库。它可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。下面即是对hibernate各模块的总结。
一、hibernate工作原理:
通过在项目中配置nibernate控制文件和类对象对应的映射文件,实现对jdbc的封装,对javabean类和关系数据库进行映射,实现了对数据库的面向对象方式的操作,相比传统的jdbc + sql操作数据的方式来说,它很大程度地方便了我们的开发。
二、配置hibernate流程:
1.创建一个动态web项目,将hibernate的最新版本和mySql的JDBC驱动库加到项目中。
2.在项目目录下创建hibernate的核心控制文件hibernate.cfg.xml,这里面设定了运行hibernate所必须的相关配置参数。
3.在数据库中创建一个pojo表,对应地在项目中创建一个pojo类。
4.编写pojo类对应的映射文件,以便让hibernate负责对pojo对象到数据库的存取。将映射文件和文件路径加入到hibernate.cfg.xml中。
5.编写一个类,负责从数据库中取到与数据库的连接对象session。
6.编写实现pojo对象的数据库访问类,实现对pojo对象的访问数据库操作。
7.测试。
三、hibernate工作流程:
1.新建一个pojo对象。
2.取到hibernate中的session对象。
3.通过session对象开启事务。
4.session从hibernate控制文件中找到将要访问的数据库,连接上数据库。再找到pojo类所对应的映射文件,将项目中的pojo类映射到数据库中的pojo表。
5.session将对pojo对象的操作结果保存到数据库中。
6.最后关闭session,结束访问数据库操作。
7.测试结果中可以看到hibernate得到的对应的数据库访问操作。
四、延迟加载:
一般情况访问数据库操作中,读取一个对象时会将与这个对象所有相关的其他对象一起读取出来,但问题是并非所有的数据对我们来讲是有用的,也许我们想要的只是一个对象,但读取到的可能是很多个对象,这经常会导致整个数据库都在初始化的阶段被读出来了。而Hibernate的延迟加载机制很好地解决了这个问题。hibernate的延迟加载只在一个对象调用它的一对多或多对多关系时才将关系对象读取出来。这个过程只进行了很少的数据库操作请求,因此会得到比较明显的性能提升。
但这种延迟加载的缺陷是Hibernate会话要在对象使用的时候一直开着。而为了将持久化机制完全地抽象出来,所有的数据库逻辑,包括打开或关闭会话,都不能在应用层出现。另一种解决方法是spring框架下的延迟加载。Spring框架为Hibernate延迟加载与DAO模式的整合提供了一种方便的解决方法。Spring提供了OpenSessionInViewFilter和OpenSessionInViewInterceptor。我们可以随意选择一个类来实现相同的功能。Filter在Spring之前运行并被配置在web.xml中,而interceptor在Spring容器中运行并被配置在web应用的上下文中。这两种都在请求将当前会话与当前(数据库)线程绑定时打开Hibernate会话。
五、主键生成机制:
hibernate中存在多种主键,不同的主键生成方式也不尽相同。
1.Assigned:主键的生成值由我们自己决定,而与数据库无关,我们只需要在调用session.save()之前要指定它的主键值就行。
2.Hilo:Hilo主键生成方式由Hibernate 维护,与底层数据库无关。需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性。3.Increment:由Hibernate本身维护,适合单一进程访问数据库。对主键值采取自动增长的方式生成新的主键值。
4.Identity:与底层数据库有关,要求数据库支持Identity,无需Hibernate和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。根据底层数据库支持自动增长。5.Sequence:需要底层数据库支持Sequence方式,从支持序列的数据库移植到不支持序列的数据库需要修改配置文件。
6.Native:主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式。项目中如果用到多个数据库时,可以使用这种方式。
7.UUID:使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
8.Foreign GUID:多用于一对一关系中。GUID主键生成方式使用了一种特殊算法,保证生成主键的唯一性。
六、hibernate中的对象状态:
1.自由状态:通过new创建的一个对象,还未在数据库中持久化,也没有与session进行关联。此时的对象没有数据库中对应的ID。
2.持久状态:对象已经被保存到数据库中,并且与之关联的session对象还未关闭。
3.游离状态:对象保存到数据库后脱离了session的管理,或者说session已经关闭。
4.移除状态:调用了通过session的delete()或remove()方法从数据库中移除掉的对象。
七、hibernate的悲观锁和乐观锁:
悲观锁:操作数据之前就锁定数据,以防止其他应用破坏事务。因为考虑到对坏情况,故被称为悲观锁。它在查询数据库之前调用setLockMode()方法,设定锁定模式。
乐观锁:与悲观锁相反,乐观锁是当前事务在操作数据时并不锁定数据,而是在提交数据时进行检查提交的数据是否被改动,不改动则成功提交,否则事务失败。
八、hibernate核心接口:
1.Session:负责执行被持久化对象的CRUD操作。
2.SessionFactory:负责创建Session对象并初始化Hibernate。一般情况下,一个项目通常只需要一个SessionFactory。
3.Configuration:负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
4.Transaction:负责事务相关的操作。
5.Query和Criteria:负责执行各种数据库查询。
希望一点小小的总结能对学习hibernate的同志们和我自己一点帮助。
[size=large][/size]呵呵 不错嘛