hibernate如何初始化
要在应用中使用Hibernate,首先要初始化Hibernate的运行环境,使持久化类和数据库受控于Hibernate,才能使用Hibernate提供的接口实现对象和数据库的互操作。
使用了hibernate很长时间,一直都是在使用的过程中,发现项目在启动的时候,系统会预先初始化hibernate的环境,但一直没有仔细研究为什么在项目启动的时候会初始化hibernate以及是如何开始初始化的。仔细看看项目里的web.xml文件,发现项目中有spring的配置文件,spring配置文件中引入了hibernate的配置文件,原来是spring读取了hibernate的配置文件,导致hibernate的初始化!如果项目里就只有hibernate的jar包,web.xml里什么都没有,很显然在项目启动的时候是不会初始化hibernate的,但是当你在页面上第一次调用hibernate的时候,hibernate就会完成所有的初始化工作。
由于Hibernate在内部封装了Hibernate环境的初始化过程,因此只要在应用程序中简单的使用配置文件初始化就可以了。configuration对象是整个hibernate应用的入口,在使用hibernate功能之前首先创建Configuration对象的实例和进行Hibernate参数的初始化工作。
首先,应用通过实例化Configuration对象初始化应用环境。该对象读取配置文件和映射文件信息,并解析这些文件,然后根据配置文件和映射文件的定义,设置应用的环境。在解析过程中:
l Configuration对象根据配置文件的设置,读取属性配置信息,比如:JDBC连接属性、方言属性等。然后检查属性配置并把配置信息放入应用环境中。系统默认的配置文件路径是应用程序的classpath,当然也可以指定配置文件路径,不过这需要使用Configuration对象的configure()方法指定配置文件。
l Configuration对象根据配置文件的信息,按照映射文件、类缓存、集合缓存、监听器、事件的顺序依次读取并解析。如果是映射文件,则根据配置的路径解析映射文件,实现持久化类到数据表的映射配置。如果是缓存配置,则根据缓存配置策略设置类或集合的缓存特性。
l 构建SessionFactory。通过调用Configuration对象的buildSessionFactory()方法,可以获取一个SessionFactory对象实现。buildSessionFactory()方法根据以上两步的配置,验证配置属性和映射属性,返回SessionFactoryImpl对象实例。SessionFactoryImpl是SessionFactory的一个实现。
接下来,通过Configuration对象获取SessionFactory的实现,并通过SessionFactory的实现获取Session对象,完成数据操作任务,过程如下:
l 根据Configuration对象获取SessionFactory对象。SessionFactory根据Configuration对象获取的配置信息和映射信息,完成应用的元数据配置。SessionFactory根据属性配置对关系数据库进行设置,以便Hibernate管理。比如:如果设置了属性hbm2ddl.auto的值为create,那么,Hibernate将自动根据映射文件生成数据库模式并导入到数据库中。在运行期间,SessionFactory是元数据的缓存且不允许修改。
l 获取Session对象。SessionFactory是Session的工厂。通过调用SessionFactory实例的openSession()方法可以获取SessionImpl对象。SessionImpl是Session接口的实现。即:openSession()方法使用SessionFactory的中的元数据信息和JDBC连接等初始化Session对象。
l 启动事务。使用Session对象实现数据的操作时,这些操作单元需要放置于事务范围中。Hibernate对数据库事务进行了封装,实现了统一的事务处理方式,具体可以通过Session对象的beginTransaction()方法,开始一个事务。Session对象的beginTransaction()方法将事务的创建和启动合二为一,简化了用户的操作。JDBCContext使用应用程序的配置信息从事务工厂中创建Hibernate事务,并通过Session对象的beginTransaction()方法提供给客户。
l 提交事务。数据操作完成后,需要提交事务,确认对数据库的操作。如果事务没有提交,那么在该事务范围内的数据操作不会对数据库造成影响。在Hibernate中,事务的提交只需要调用刚刚获取的Hibernate事务对象的commit()方法即可。底层事务的提交操作细节由Hibernate的事务对象负责完成。
l 关闭应用。在完成业务逻辑的处理后,关闭系统时,需要清理Hibernate应用环境,释放Hibernate占用的资源。首先通过Session对象的close()方法关闭Session对象,释放数据库连接,清除session中的对象。然后通过SessionFactory对象的close()方法关闭SessionFactory对象,释放所有的数据库连接,清理缓存中的对象并关闭缓存,如果配置文件中hbm2ddl.auto属性的值是drop或create-drop,Hibernate将删除对应的数据库模式。