这是我根据所学总结的,希望能够对大家有所帮助
Configuration 实例化 SessionFactory
实例化
session
实例化
Query Criteria Transaction
Hibernate核心接口框图
1,Configuration类
主要作用:读取配置文件、启动Hibernate的配置信息。一个应用程序只创建一个Configuration对象。
常用的操作方法:
①, configure()方法
Configuration config = new Configuration.configure();
调用它后,Hibernate会自动在当前的CLASSPATH所指定的路径下查找XML配置文件Hibernate.cfg.xml,将其内容加载到内存中。
该方法还可以传入参数。当需要指定自定义配置文件的路径时,可使用如下代码:
File file = new File("c:\\hibernate.xml");
Configuration config = new Configuration.configure(file);
还可以直接在参数中传递路径值。
②, Configuration类中还提供了可动态地对配置参数进行修改的方法。
加载多个自定义的XML文件:
Configuration cfg = new Configuration()
.addResource("h1.hbm.xml")
.addResource("h2.hbm.xml');
//还可以使用addClass方法指定被映射的类,Hibernate会自动搜索到需要的映射文件
③, 调用setProperty方法动态配置属性的值
还可以通过将java.util.Properties实例传入Configuration.setProperties();
总结:当调用Configuration 实例建立了SessionFactory实例后,配置信息便和SessionFactory实例建立了联系,当后续修改Configuration实例的配置属性时,不会影响到之间创建的SessionFactory实例。Configuration实例是启动时期的对象,创建完SessionFactory实例后,它的任务就完成了。
2,SessionFactory接口
SessionFactory接口负责Hibernate初始化,它作为数据源代理,负责建立Session对象。在Hibernate中,SessionFactory实际上起到了一个缓冲区的作用,它是线程安全的,它的同一实例可以提供给多个线程共享;它也是重量级的,不能随意创建和销毁它的实例。当项目中要操作多个数据库时,必须为每一个数据库指定一个SessionFactory。
创建SessionFactory实例:
Configuration cfg = new Configuration.configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
常用的SessionFactory的方法
① getCurrentSession()和openSession() 创建session实例
getCurrentSession创建的实例会被绑架到当前的线程中,在提交或回滚操作后自动关闭;openSession方法是SessionFactory直接创建一个新的session实例 ,在使用完成后需要调用close()方法手动地关闭。
当使用getCurrentSession方法创建session时,需要在hibernate.cfg.xml配置文件中添加如下配置:
<property name="hibernate.current_session_context_class">thread</property> //使用本地事务时
<property name="hibernate.current_session_context_class">jta</property>
//使用全局事务时
//创建瞬时态对象
User user = new User();
user.setName("张三");
//user对象处于瞬时态
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//开启事务,user对象仍为瞬时态
session.save();
//调用save方法持久化user对象,user对象转换为Persistent状态
tx.commit;
session.close(); //关闭session
//此时,user处于游离态
③saveOrUpdate()方法 依据对象的不同状态执行不同的操作
④delete()方法 删除实例所对应的数据库中的记录
⑤get()和load()方法 通过标识符得到指定类的持久化对象
当持久化对象不存在时,load()方法会抛出异常,get()方法会返回null;
load方法可以返回实体类的代理类实例,即当映射文件中的class元素的lazy属性设置为true时(延迟加载)
代理类仅仅只有id属性不为空值,只有当代理类实例调用getXXX()方法时,Hibernate才真正地到数据库中获得属性值。
都是先从Session的内部缓存中开始查找指定实体对象,如果没有找到,则load()方法会查询Hibernate的二级缓存,然后再到数据库中进行查询,而get()方法会越过二级缓存直接发出sql语句到数据库中完成数据的读取
⑥contains()方法 判断一个实体对象是否与当前的session实例相关联,也即判断实体对象是否处于Persistent状态
⑦evict()方法 移除缓存中实体对象与Session实例之间的关联关系来清除指定的对象,执行该方法以后,实体对象由持久态转变为游离态。一般与contains()方法结合使用
⑧查询的方法,获取持久化对象
creatQuery()方法 使用HQL语言进行数据库的查询
creatCriteria()方法 可设置条件来进行查询
creatSQLQuery()方法 使用标准的SQL语句来进行查询
⑨creatFilter()方法 用于一个持久化集合或者数组的特殊的查询,查询的字符串中可以使用this关键字来引用集合中的当前元素
4, Transaction接口 管理事务
在配置文件中可以选择使用本地事务或全局事务 还可以对隔离级别进行设定(1,2,4,8)
本地事务只针对一个数据库进行操作,而全局性事务由应用服务器进行管理,它需要使用JTA,可以用于多个事务性的资源。
<property
name="hibernate.current_session_context_class">thread</property>
<!--本地事务-->
<property
name="hibernate.current_session_context_class">jta</property>
<!--全局事务-->
<property name="hibernate.connection.isolation">4</property>
<!--隔离级别-->
commit() 事务提交 rollback()事务回滚方法
5,Query接口