Hibernate框架是一个非常流行的持久化框架,其在Web开发中占据了非常重要的地位。Hibernate作为Web应用的底层,实现了对数据操作的封装。Hibernate框架的应用可以改变传统的JDBC操作数据库的方式。
使用Hibernate框架最核心的是关于整体数据库的配置文件和与之相关的类。
l Configuration类
l Hibernate配置文件
l SessionFactory类
l Hibernate中的对象:临时对象、持久化对象、脱管对象
l Hibernate中的持久化类:
1.1 Configuration类
Configuration类负责管理Hibernate的配置信息,一个Configuration类的实例代表了应用程序中Java类到数据库的映射的集合。应用程序通常只是创建一个Configuration实例,并通过它创建SessionFactory实例。例如下面的代码:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
1.2 Hibernate配置文件:hibernate.cfg.xml
Configuration是Hibernate的入口,在新建一个Configuration的实例时,Hibernate会在类路径中查找文件hibernate.properties和hibernate.cfg.xml文件,如果这两个文件同时存在,则hibernate.cfg.xml将会覆盖hibernate.properties文件;如果两个文件都不存在,将抛出异常。
1.3 SessionFactory类
SessionFactory负责Session实例的创建。为了创建一个SessionFactory对象,必须在Hibernate初始化时创建一个Configuration类的实例,并将已写好的映射文件交由它处理。这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没有用了,可以简单地抛弃它。例如下面的实例代码:
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
SessionFactory是线程安全的,可以被多个线程调用以取得Session对象,而构造SessionFactory很消耗资源,所以多少情况下一个应用中只初始化一个SessionFactory,为不用的线程提供Session。SessionFactory是重量级的,不能随意创建或者是销毁。
1.4 Hibernate中的对象:临时对象、持久化对象、脱管对象
(1)临时状态
对象在进行数据库保存操作之前被称之为临时状态,此时的数据库中并没有该对象的任何信息,而且该对象的Id信息。如果此时没被进行持久化,则会在程序退出时丢失临时状态对象的任何信息。
由Java中的new命令开辟内存空间的Java对象,也就是平时所熟悉的普通Java对象。如果没有变量对它引用,它将被JVM收回。临时对象在内存是孤立存在的,它的意义仅仅是携带信息的载体,不和数据库中的数据有任何关联。通过Session的save()和saveOrUpdate()方法可以把一个瞬时对象和数据库相关联,并把临时对象携带的信息通过配置文件所做的映射插入到数据库中,这个临时对象就成为持久化对象,并拥有和数据库继续相同的id字段。
(2)持久化状态
对象在保存到数据库后但并没有脱离Session的时候被称为持久化状态。该状态时的数据库中已经有了该对象的信息,而且该对象的Id为数据库中对应记录的主键值。不过由于此时还存在于Session中,所以持久化状态的对象可以对任何有关数据库的操作进行执行。
持久化对象在数据库中有相应的记录,并拥有一个持久化标识。如果使用delete()方法,持久化对象就变成临时对象,并且删除数据库中相对应的记录,这个对象和数据库不再有任何关联。
当一个Session执行close()或者clear()或evict()之后,持久化对象就变为脱管对象,这时对象的id虽然拥有数据库的识别值,但已经不在Hibernate持久层的管理之下,它和临时对象基本上是一样的,只不过比临时对象多了数据库的标识id值。在没有任何变量引用此对象的情况下,JVM可能将其回收。
(3)脱管状态
Session关闭之后,与此Session相关联的持久化对象就变为脱管对象,可以继续对这个对象做修改。如果脱管对象被从新关联到某个新的Session上,会在此转成持久对象。
脱管对象拥有数据库的标识id,所以它可以通过update()、saveOrUpdate()等方法,再次与持久层关联。
1.5 Hibernate持久化类
什么是ORM,ORM的全称是Object/Relation Mapping即对象/关系映射。ORM在单独的持久化层,由ORM中间件对数据细节访问进行封装。ORM可以通过映射来实现对数据操作转换为对象的操作。
对象指使用的编程语言是面向对象的,而关系则指使用的数据库是关系型数据库。对象/关系映射则是指完成面向对象语言到关系型数据库的映射,通过映射后,我们可以像操作对象一样来操作我们的数据库。
Hibernate开发,通过创建一个持久化类来映射一个数据库表。其中持久化类的属性则映射到数据库表中的字段。当我们使用面向对象的方式来操作持久化对象时,ORM框架能自动将这些操作转换成SQL语句,从而完成对数据库的操作。