3.Hibernate核心接口
3.1Configuration接口
Configuration对象用来配置和引导Hibernate,一个Hibernate应用使用一个Configuration实例来指定主配置文件的位置,然后创建会话工厂。
Configuration cfg = new Configuration().configure("/cfg/auction.cfg.xml")
在我们的代码中,配置文件是自动探测的,Configuration cfg = new Configuration().configure();configure()方法未带参数的时候,Hibernate会在classpath的根路径搜索名为hibernate.cfg.xml的文件,如果没有找到将会抛出异常。这就是为什么我们要将Hibernate主配置文件命名为hibernate.cfg.xml,并且将其放在src目录下(src目录映射到编译后的classpath根路径)的原因。
3.2SessionFactory接口
一个Hibernate应用从SessionFactory(会话工厂)里获得会话实例。
一般情况下,整个应用只有唯一的一个SessionFactory,它应该在应用初始化时被创建。
它是一个重量级、单实例接口,创建时消耗资源较多,而且它只需要存在一个对象就够了。可以编写一个工具类,将SessionFactory的实例设置为静态成员(只在内存中存在一份)并将其初始化放在静态初始化块中(只执行一次)。例如:
import org.Hibernate.SessionFactory; import org.Hibernate.cfg.Configuration; import org.Hibernate.service.ServiceRegistry; import org.Hibernate.service.ServiceRegistryBuilder; public class HibernateUtil { private static SessionFactory sessionFactory;//静态变量 static {//静态初始化块 try { Configuration cfg = new Configuration().configure(); //Hibernate4提供的新方式 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(cfg.getProperties()).buildServiceRegistry(); sessionFactory = cfg.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { getSessionFactory().close(); } }
3.3Session接口
Session(会话)接口是Hibernate应用使用的主要接口,它拥有操作持久化对象的一系列API,可用于管理(例如加载和保存)对象,因此我们也称之为“持久化管理器”。
Session实例是轻量级的,创建与销毁的代价不昂贵,通常我们会为每个事务创建一个Session实例,并在使用后关闭它。
3.4Transaction接口
Transaction(事务)接口是对实际事务实现的一个抽象,这些实现包括JDBC事务或者JTA事务等。
在Transaction接口中主要定义了commit()和rollback()两个方法,前者是提交事务的方法,后者是回滚事务的方法。
3.5Query接口
Query(查询)接口允许在数据库上执行查询,并控制查询如何具体执行。查询使用HQL或SQL。Query实例可用来绑定查询参数,限定查询返回的结果数,并且最终执行查询。
4.Hibernate中实体对象的三种状态
实体对象的生命周期是Hibernate 应用中的一个关键概念
实体对象的三种状态:
(1)瞬时状态(Transient)
刚用new语句创建,还没有被持久化,且不处于Session的缓存中
(2)持久状态(Persistent)
已经被持久化,且加入到Session的缓存中
(3)游离状态(Detached)
已经被持久化,但不再处于Session的缓存中
app操作对象状态,在某一时刻,Hibernate会将对象状态同步到数据库
瞬时对象的状态的改变不会被同步,直到它变成一个持久状态
游离对象的状态的改变不会被同步,直到它变成一个持久状态
实体对象的三种状态的转换:
new产生的对象—瞬时态通过save saveOrUpdate方法转换为持久态,通过delete方法可以将对象变回瞬时态;
开始通过get()、load()方法等进入持久态;
通过evict()、clear()方法或session关闭之后,原有的持久态就变成了游离态,游离态通过update()、saveOrUpdate()、lock()方法可重新回到持久态,并在事务提交的时候和数据库同步session的get load()方法可直接获得一个持久态对象;
持久态和游离态的共同点在于,都有数据表的一行与之对应,不同的是,持久态在session范围内(在缓存区中),而游离态不在session范围内。
其中evict()方法是清除缓存中的指定对象或集合、clear()方法是清空缓存。