说了很长时间“Hibernate完成了数据的持久化”,但却没有真正了解过什么是持久化,下面就参考《java程序员面试宝典》总结一下。


任何计算机程序都是由指令和数据两部分组成,持久化数据对于大多数程序,尤其是企业级应用程序,是必不可少的。数据持久化,也就是把数据保存起来,并且还可以供程序获取这些数据的全部或某一部分。java程序有3个持久化数据的途径:文本文件、对象的序列化和数据库(hibernate就是完成这里的数据持久化):

1.使用文本把数据保存起来,把数据按照一定的格式,如键值对、以逗号相隔等形式,利用java的文件系统I/O功能把数据进行保存和读取。由于I/O的速度比内存操作慢很多,所以这种方式适合数据量少、结构单一的情况。

2.对象的序列化,指的是把实现了java.io.Serializable接口的类的实例对象保存在文件系统中,当需要读取数据时,通过反序列化机制把文件系统的数据又映射回内存,还原数据。可以满足复杂的数据存取,但对象序列化本质还是需要使用java的文件系统I/O功能,所以仍然存在大数据量的性能问题。

3.关系数据库是目前数据持久化最成熟的产品,也是java程序首选的数据持久化解决方案。它能够存储海量的数据,提供高性能的数据检索功能,大多数数据库厂商也提供了java的JDBC驱动。但是,如果使用JDBC来操作数据,会有以下几项不可避免的弊端:

1)数据操作的代码量巨大:主要体现在重复的SQL语句;

2)重复劳动的填装数据:把结果集ResultSet的数据一一填装到数据对象,再把数据对象放到集合中;

3)面向对象的思想和关系模型之间的冲突:由于关系数据库是建立在关系模型基础上的,通过SQL和JDBC可以让关系模型模拟面向对象之间的关系,但是关系过于复杂,会非常难写,从而降低开发效率。

Hibernate就是用来解决这种对象关系映射的工具。(对象关系映射ORM是为了解决面向对象与关系数据库之间的互不匹配现象的技术。)

Hibernate中持久化对象有三种状态:

1)瞬时状态:new了一个对象,但对象没有被Session对象操作,对象不能被持久化到数据库中。

2)持久状态:一个对象与某一个Session对象关联。持久化状态的对象鱼数据库中一条记录对应,并拥有持久化标识。

3)脱管状态:与持久状态对象关联的Session关闭后,该对象就变成脱管状态。脱管状态的对象应用仍然有效,当对象再次与Session对象关联后,又进入持久状态,这时脱管状态下的修改会持久化到数据库中。