Hibernate--基础知识
Hibernate的基本组成:
实体类,实体类的映射文件,hibernate的配置文件
Hibernate中的常用接口:
Configuration:
读取Hibernate的配置文件。
概述:Configuration 类负责管理Hibernate 的配置信息,即:加载Hibernate配置文件(hibernate.cfg.xml)。它包括如下内容:
Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等( hibernate.cfg.xml )。
Hibernate实体映射文件(*.hbm.xml)。
Hibernate读取配置文件的两种方法:
读取属性文件(hibernate.properties)-基本不会采用这种配置文件
调用代码:Configuration cfg = new Configuration();
读取XML文件(hibernate.cfg.xml)—常采用这种配置文件
调用代码:Configuration cfg = new Configuration().configure();
SessionFactory(会话工厂):
一个SessionFactory(会话工厂)对应一个数据库。
它与数据库绑定,一个数据库对应一个SessionFactory,关于数据库中的所有东西(例如:表之间的关联)都放在SessionFactory中了,二级缓存与SessionFactory相关,二级缓存就是进程级的缓存,就相当于Web中的Application对象,因此它是重量级的,它的创建时间比较耗时,所以该对象只创建一个,不要频繁创建。
应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享,所以SessionFactory是线程安全的。通常情况下,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,这时你就需要对每一个数据库使用不同的会话工厂(即:需要为每个数据库都创建一个会话工厂)。
会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
调用代码:
SessionFactory sessionFactory = cfg.buildSessionFactory();
说明:SessionFactory由Configuration对象创建,所以每个Hibernate配置文件,实际上是对SessionFactory的配置。(对照hibernate.cfg.xml文件)
Session(会话):
它是操纵Hibernate进行CRUD(增、删、改、查)操作的。
Hibernate在进行CRUD操作时必须使用Session,Session不同于JDBC中的Connection。也可以这样理解Session对Connection又进行了一层包装,打开一个Session并不等于打开一个Connection那么简单,因为Session的功能要比Connection强,Session不仅具有Connection的功能,还具有管理一级缓存的功能,例如:在Hibernate中保存一个对象,Hibernate要完成两个功能,一是发出相应的SQL语句将数据存储到数据库表中,另一个功能是把当前这个对象放入到缓存中。
Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间,由于不是线程安全的,所以不能多线程共享使用,否则会产生莫明其妙的问题,Session通常是一个业务请求过来,就open出一个Session,业务请求完毕后Session随之关闭,通常是Session关闭后,与该Session对应的事务就关闭了,即一个业务请求对应一个事务。
Session也称为持久化管理器,因为它是与持久化有关的操作接口。
Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
它与Web层的HttpSession没有任何关系。
调用代码
Session session = sessionFactory.openSession();
Transaction(事务):
在进行数据查询时不需要打开事务;当对数据进行增删改的时候才有必要打开事务。
概述
它将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,或者是一个JTA用户事务甚至可能还是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界(即:底层无论是什么事务,我们在编写代码时使用的是相同的API,API会自己协调底层不同事物之间的差别,我们不需要关心)。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。
调用代码:
Transaction tx = session.beginTransaction();
注:使用Hibernate进行操作时必须显式的调用Transaction
(默认:autoCommit=false)。
Query接口
概述:
Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言(即数据库的SQL语句)编写。
调用代码:
Query query = session.createQuery("from User");