1:应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息。
2:并用这些信息生成一个SessionFactory对象。
3:然后从SessionFactory对象生成一个Session对象。
4:并用Session对象生成Transaction对象。
5:可通过Session对象的get()、load()、save()、update()、delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作。
6:在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。
Configuration是hibernate的配置对象,主要用于解析Hibernate配置文件和持久化映射文件中的信息,最重要的功能,是用来创建SessionFactory对象.(主配置文件都要存放在CLASSPATH根路径,映射文件存放在domain同路径)
可以把所有的配置信息全部放在hibernate.cfg.xml中,一般不使用hibernate.properties. 建议把基本配置信息全部放在hibernate.properties中,而在hibernate.cfg.xml只存在引入映射文件的配置
Configuration主要管理hibernate.cfg.xml主配置文件,及持久化类与数据表的映射关系(*.hbm.xml文件)。
1):创建Configuration的两种方式:
1:通过属性文件(hibernate.properties)
Configuration cfg = new Configuration();
2:通过Xml文件(hibernate.cfg.xml)
:加载默认名称的配置文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
:或加载指定名称的配置文件
Configuration cfg = new Configuration().configure(“myhibernate.cfg.xml”);
2):Configuration类其它方法:
1:addResource(String resource):导入一个指定位置的映射文件。
2:addClass(Class clazz):导入与指定类同一个包中的以类名为前缀,后缀为.hbm.xml的映射文件。
3:buildSessionFactory():创建Session工厂。如:SessionFactory sf = cfg.buildSessionFactory();
3):ServiceRegistry
ServiceRegistry 是 Service 的注册表, 它为Service提供了一个统一的加载/初始化/存放/获取机制.
1):Hibernate4.2之前
ServiceRegistry registry = new ServiceRegistryBuilder().build();
2):Hibernate4.3以后
ServiceRegistry registry = new StandardServiceRegistryBuilder().build();
SessionFactory sessionFactory = cfg.buildSessionFactory(registry);
3):通过工具类创建SessionFactory对象
Configuration对象根据当前的配置信息生成SessionFactory对象。
SessionFactory对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时SessionFactory还负责维护Hibernate的二级缓存:
1):SessionFactory负责创建Session对象.
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
2):SessionFactory是线程安全的,SessionFactory是生成Session的工厂,SessionFactory的创建需要很大的系统开销,实际上,在创建sessionFactory的时候才会去连接数据库,一般的,针对一个应用,一个数据库服务器,只需要一个SessionFactory实例就够了.
Connection对象是线程不安全的,DataSource却是线程安全的.
Connection对象每次都要创建新的对象,DataSource在开发中只需要存在一个实例即可.
3):SessionFactory对象中openSession和getCurrentSession方法的区别
1:openSession:这个方法代表,开启一个全新的Session(测试环境)
1.全新的连接,好比创建新的Connection对象.
2.全新的事务
3.全新的一级缓存
2:getCurrentSession:得到当前上下文中的session,绑定到当前线程.(开发环境)
1.如果当前上下文中存在session,则使用该session;
2.如果当前上下文中不存在session,则使用openSession创建一个新的session;
3.要使用getCurrentSessoin,必须在hibernate.cfg.xml中配置
4.getCurrentSession得到的session是和事务绑定的(Spring集成Hibernate的方式);
1,无论是DML还是DQL ,都必须开启事务
2,当事务提交的时候,session就跟着关闭了.-->此时不需要人为的调用:session.close()
3:我们平时在测试的时候,还是使用openSession就可以了,关于事务的解决到spring中;
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。
此对象的生命周期很短。
Session对象,通过SessionFactory对象创建而来,包含了Connection对象,封装了很多操作方法.
1):Session类的一些方法:
1:取得持久化对象的方法: get()、load()
2:持久化对象保存,更新和删除:save(Object)、update(Object)、delete(Object)
3:查询的方法:createQuery(String)、createCriteria(Class)
4:管理事务的方法:beginTransaction()、getTransaction()(获取当前Session中关联的事务对象)
5:管理Session的方法:isOpen()、flush()、clear()、evict()、close()等。 clear():清空一级缓存所有对象,evict(Object o):从一级缓存中清除指定的对象.
2):Session的缓存
1:session不是线程安全的(使用局部变量),所以session的最大生命周期:一个线程。
2:Session中有一个缓存,称为一级缓存。显式执行flush()方法之前,所有的持久层操作的数据都缓存在session对象处。它存放当前工作单元加载的对象。
3:在一个session的生命周期之内,连续拿相同类型,相同ID的对象,只需要发送一次SQL。
4:一级缓存能提高一定的性能,但是有限(期待二级缓存).
5:session加载出来的对象,都存放于一级缓存中进行管理.
按照方法的功能,把session的方法分为:
1):事务相关:
Transactionsession.beginTransaction():标记打开当前session绑定的事务对象。
Transactionsession.getTransaction():得到和当前session绑定的事务对象。
2):一级缓存相关:
session.clear():清除一级缓存中所有的对象。
boolean contains(Object entity):判断一级缓存中是否有给定的对象。
session.evict(Object entity):从一级缓存中清除指定的对象。
session.flush():把一级缓存中的脏数据同步到数据库中。
session.refresh(Objectentity):强制重新查询对象,相当于把数据库中的数据同步到一级缓存中。
3):持久化操作相关:
session.delete(Objectentity):从数据库中删除一个对象
session.update(Objectentity):更新一个对象
session.get(ClassentityType,Serializableid):根据主键查询一个对象
session.load(ClassentityType,Serializableid):根据主键加载一个对象
1.load方法是一个延迟加载(lazy-load)的方法;把对象的获取(SQL)延迟到了真正使用这个对象的时候才发送;
2.真正使用?当使用一个非主键属性的时候;
3.load实现原理?使用动态代理,为load的domain动态创建了一个子类,在这个子类中,复写所有非主键调用方法,在这些方法中,去发送.
session.save(Objectentity):保存一个对象
session.persist(Objectentity):保存一个对象(
1,同步JPA的接口方法;
2,和save的区别:在没有事务环境下,save方法会发送INSERT SQL,persist不会;)
session.saveOrUpdate(Objectentity):如果对象没有保存到数据库,则保存,如果已经保存过,则更新。
session.merge(Objectentity):等同于saveOrUpdate方法。
1,同步JPA的接口方法;
2,和saveOrUpdate的区别:在没有事务环境下,saveOrUpdate方法会发送INSERT SQL,merge不会;
4):其他:
session.close():关闭session,相当于关闭了和session关联的connection对象。关闭session之后,就不能再使用这个 session完成持久化相关的操作。
session.doWork(Workwork):Hibernate提供给程序员直接使用JDBC的一个途径。
session.doReturningWork(ReturningWork):Hibernate提供给程序员直接使用JDBC的一种途径。
Serializablesession.getIdentifier(Objectentity):得到一个对象的主键值
session 上面所有的方法都在促使对象的状态发生改变.
Transaction代表一次原子操作,它具有数据库事务的概念。
所有持久层都应该在事务管理下进行,即使是只读操作。
2):Transaction对象:代表对事务的封装;
1.Transaction tx = session.beginTransaction():设置当前事务为活动状态
2.Transaction tx = session.getTransaction():得到当前session上面已经活动的事务对象。
注意,在调用这个方法之前必须调用beginTransaction()方法;(该方法得到的对象永远不会为空)
3):常用方法:
1.tx.commit():提交相关联的session实例
2.tx.rollback():撤销事务操作
3.wasCommitted():检查事务是否提交。
Query和Criteria接口都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。
Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,他擅长执行动态查询。
1):Query接口有如下常用方法:
1:list():查询一个结果集合。
2:uniqueResult():查询一个唯一的结果,如果没有结果,则返回null,如果结果有多个,就抛异常。
例1:
Query query =session.createQuery("FROM User")// 使用HQL查询
List
例2:
List
例3:
List
2):Criteria查询
例1:
Criteria criteria = session.createCriteria(User.class);
List
例2:
Criteria criteria = session.createCriteria(User.class);
// 增加过滤条件
criteria.add(Restrictions.eq("id", 5)); // id=5的条件
List
例3:
Criteria criteria = session.createCriteria(User.class);
// 增加排序条件
criteria.addOrder(Order.asc("id"));
List