Hibernate(三)


Hibernate体系结构简析

Hibernate(三)_第1张图片

>Transient Object(瞬态和托管对象):系统通过new关键字创建的Java实例,没有与Session关联,此时处于瞬态。瞬态实例可能是在被应用程序实例化后尚未进行持久化的对象。如果曾经持久化过的实例,而Session被关闭则转换为托管状态。

>Persistent Object(持久化对象):系统创建的POJO实例,一旦与特定的Session关联,并对应数据表的指定记录,该对象就处于持久化状态,这一系列对象都被称为持久化对象。在程序中对持久化对象执行的修改,都将自动被转换为对持久层的修改。持久化对象完全可以是普通的JavaBean或POJO,唯一区别是它们正与一个Session关联。

>SessionFactory: 是Hibernate的关键对象,是单个数据库映射关系经过编译后的内存镜像,是线程安全的。它是生成Session的工厂,本身需要依赖于ConnectionProvider。该对象可以在进程或集群的级别上,为那些事物之间可以重用的数据提供可选的二级缓存。

>TransactionFactory(事务工厂):是生成Transaction对象实例的工厂。该对象也无需应用程序直接访问,它负责对底层具体的事务实现进行封装,将底层具体的事务抽象成Hibernate事务。

>ConnectionProvider:是生成JDBC连接的工厂,通过抽象将应用程序与底层的DateSource或DriverManager隔离开。这个对象无需应用程序直接访问,仅仅在引用程序需要扩展时使用。

>Session:是应用程序与持久层之间交互操作的一个单线程对象。所有持久化对象必须在Session的管理下才可以进行持久化操作。此对象生存期很短。它底层封装了JDBC连接,它是Transaction的工厂。Session对象持有必选的一级缓存,显式执行flush之前,所有持久化操作的数据都在缓存中的Session对象处。

>Transaction(事务):代表一次原子操作,它具有数据库事务的概念。Hibernate事务是对底层具体的JDBC、JTA以及CORBA事务的抽象。某些情况下,一个Session之内可能包含多个Transaction对象。虽然事务操作是可选的,但所有持久化操作都应该在事务管理下进行,即使只是只读操作。

实际应用中很少用DriverManager来获取数据库连接,通常会使用DataSource来获取数据库连接,因此ConnectionProvider通常由DataSource充当,所以SessionFactory底层封装的ConnectionProvider一般是DataSource。

Hibernate流程简析

Hibernate 访问数据库主要步骤:

1. 首先要获取Configuration,读取并解析配置文件。
创建一个 ServiceRegistry 对象,hibernate 的任何配置和服务都需要在该对象中注册后才能有效。

Configuration conf = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();


2. 获取SessionFactory,读取并解析映射信息,
SessionFactory sf = conf.buildSessionFactory();

3. 获取Session,
Session session = sf.openSession();

4.开始一个事务(增删改操作必须,查询操作可选)
Transaction tx = session.beginTransaction();

5. 用面向对象的方式打开数据库,数据库操作
session.save(user);

6.提交事务(回滚事务)
tx.commit();(tx.rollback();)

7. 关闭事物、关闭Session,
session.close();

Hibernate常用API

Configuration 类

org.cfg.Configuration实例配置应用程序到SQL数据库的配置信息,Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:
Hibernate 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。
持久化类与数据表的映射关系(*.hbm.xml 文件)

创建 Configuration 的两种方式:

1. 属性文件(hibernate.properties):
Configuration cfg = new Configuration();

2.Xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();

Configuration会自动加载hibernate.cfg.xml,看源码:

public class Configuration {
  public Configuration configure() throws HibernateException{
    return configure( StandardServiceRegistryBuilder.DEFAULT_CFG_RESOURCE_NAME );
  }
}
public class StandardServiceRegistryBuilder {
   public static final String DEFAULT_CFG_RESOURCE_NAME = "hibernate.cfg.xml";
}


Configuration类提供了一个buildSessionFactory()方法,可以产生一个SessionFactory对象。也可以先实例化Configuration实例,然后添加Hibernate持久化类。

sessionFactory = configuration.buildSessionFactory(serviceRegistry);


Configuration实例作用是创建SessionFactory实例,所以被设计成启动期间对象,一旦SessionFactory创建完成,就被丢弃。

ServiceRegistry接口

hibernate 的任何配置和服务都需要在该对象中注册后才能有效:

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

Hibernate(三)_第2张图片

这里用了StandardServiceRegistryBuilder类中的无参构造器,还有StandardServiceRegistryBuilder类中的方法,

Hibernate(三)_第3张图片Hibernate(三)_第4张图片

SessionFactory 接口

是单个数据库映射关系经过编译后的内存镜像,是线程安全的。 Configuration的实例会根据当前的配置信息,通过Configuration实例的buildSessionFactory()方法构建一个SessionFactory实例。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息,SessionFactory是生成Session的工厂。构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。SessionFactory接口提供Session的实例,SessionFactory实例是线程安全的而Session实例不是线程安全的,所以每个操作都可以共用同一个SessionFactory来获取Session。

Hibernate(三)_第5张图片

SessionFactory提供openSession()方法打开Session,

Hibernate(三)_第6张图片

Session接口

Session用于完成对数据库的操作,一般的持久化方法如CRUD都是通过Session来调用的。创建SessionFactory后,通过SessionFactory创建Session实例。通常将每个Session实例和一个数据库事务绑定,也就是每执行一个数据库事务,都应该先创建一个新的Session实例,创建Session后,可以通过创建的Session进行持久化操作,在使用Session后,需要关闭Session,即使不执行事务,都需要关闭Session实例,释放Session实例占用的资源。

Session的父接口SharedSessionContract接口提供beginTransaction()方法以供开启事务,

Hibernate(三)_第7张图片

Session接口提供很多方法供CRUD操作,

Hibernate(三)_第8张图片

Transaction接口

Hibernate是对JDBC的轻量级对象封装,本身不具备Transaction处理功能,Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装。

Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties或者hibernate.cfg.xml中的配置,如果你什么都不配置,默认情况下使用JDBCTransaction,如果你配置为:

hibernate.transaction.factory_class =net.sf.hibernate.transaction.JTATransactionFactory 

将使用JTATransaction 。

Transaction接口提供事务提交、回滚方法,

Hibernate(三)_第9张图片

你可能感兴趣的:(Hibernate)