一、Hibernate的接口分布图:
我先对该接口分布图进行一下讲解:
1.位于最底层的JNDI,JDBC和JTA是J2EE13个技术规范中的三个规范。
2.位于PersistenceLayer持久层的是Hibernate封装好的接口,用到时直接使用,不需要对其进行实现。
3.位于Business Layer业务逻辑层的Lifecycle,Validatable和Persistent Classes是与业务逻辑层进行打交道的。
其中Lifecycle接口和Validatable接口放在这里是因为之前的Hibernate的实体对象需要通过实现Lifecycle接口和Validatable接口才能触发一些特定的处理及验证(它俩是侵入性的);但是现在Hibernate又提供了新的Interceptor接口,是一种非侵入性的拦截机制,也可以实现相应的功能。
至于Persistent Classes就是持久化类,也就是咱们所说的实体类,需要自己编写,所以放在了业务逻辑层。
二、Hibernate的接口分类:
1)核心接口:
1、Configuration接口
Configuration用于配置并启动Hibernate。
Configuration可以创建相应的SessionFactory实例。
2、SessionFactory接口
一个SessionFactory对应一个数据源,一个数据库对应一个SessionFactory。
它是线程安全的,同一个实例可以被应用中的多个线程共享。
它是个重量级对象,通过查看Hibernate的源码,发现SessionFactory存放了大量预定义的SQL语句以及映射元数据,所以需要很大的缓存,因为有了Mapping文件,很多SQL语句就已经确定了,只需要动态生成一次就可以了(不可随意生成多个实例),这个设计也是为了提高持久化的效率。
3、Session接口
从SessionFactory中可以获得Session实例。
Session接口是Hibernate应用中使用最广泛的接口,它是持久化管理器,提供添加、更新、删除、加载、查询对象。
Session不是线程安全的,所以应避免多个线程共享同一个Session实例。
Session是轻量级对象,它的创建和销毁不需要太多资源,这意味着在应用中可以经常创建和销毁Session对象。
Session有一个缓存,称之为Hibernate的一级缓存,它存放当前工作单元加载的持久化对象,每个Session都有自己的缓存,缓存中的对象只能被当前工作单元访问。
4、Transaction接口
Transaction是Hibernate的数据库事务接口,它对底层事务接口进行了封装。
Hibernate应用可以通过一致Transaction接口来声明事务边界,这有助于应用可以在不同的环境或容器中移植。具体的事务实现使用在Hibernate.properties中进行指定。
5、Query和Criteria接口
这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。
Query实例包装了一个HQL(Hibernate Query Language)来查询。
Criteria接口完全封装了基于字符串形式的查询语句,比Query更面向对象,Criteria更擅长执行动态查询。
这5个核心接口是我们在使用Hibernate时经常用到的,下面列举一个查询的示例,通过这个示例我们可以对这5个接口有一个清晰的认识:
public static void main(String[] args) {
//Configuration读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//Configuration建立SessionFactory实例
SessionFactory factory = cfg.buildSessionFactory();
//取得Session
Session session = null;
try {
session = factory.openSession(); //SessionFactory创建Session实例
//开始事务
session.beginTransaction();
//使用Query查询
List users = session.createQuery("from User").list();
//使用Criteria查询
//List users =session.createCriteria(User.class).list();
//提交事务
session.getTransaction().commit();
} catch(Exception e){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
} finally {
if (session != null){
if (session.isOpen()){
//关闭session
session.close();
}
}
}
}
2)回调接口:
1、Lifecycle接口
实体对象通过实现Lifecycle接口,即可以在特定的持久化阶段,触发特定的处理过程。
2、Validatable接口
Validatable接口定义了数据验证实现方式。实体对象实现Validatable接口,并在validate方法中对当前待保存的数据进行验证,以保证数据的逻辑合法性。
3、Interceptor接口
以上2种方法都要求实现Hibernate中的Lifecycle或Validatable接口,具有很大的侵入性,使得实体对象的移植很不方便。Hibernate又提供了一种拦截机制,为对象持久化事件的捕获和处理提供了一个非侵入性的实现。
实现Interceptor接口,在创建session时,指定加载Interceptor相应的实现类,此session的持久化操作都将首先经由此拦截器捕获处理。
3)映射类型接口:
Type接口:表示Hibernate映射类型,用于把域对象映射为数据库关系数据。
4)可扩展接口:
1、定制主键的生成策略:IdentifierGenerator接口
2、定制缓存机制:Cache和CacheProvider接口
3、定制本地SQL方言:Dialect抽象类
4、定制事务管理:TransactionFactory,Transaction和TransactionManagerLookup接口
5、定制ORM策略:ClassPersister接口
6、定制属性访问策略:PropertyAccessor接口
7、创建代理:ProxyFactory接口
对于Hibernate中的接口,我们只需要熟知它的核心接口即可,其它的可作为了解。