Hibernate是一款ORM全自动框架。其优点是提高了开发效率,使得操作数据库的时候,可以以面向对象的方式来完成,不需要书写SQL语句。
ORM: Object Relational mapping 对象关系映射
Hibernate的工作流程:
工作流程:
1.读取并解析配置文件。[ 创建Configuration实例,其构造函数将配置文件(Hibernate.cfg.xml)读入到内存。一个Configuration实例代表Hibernate所有java类到数据库映射的集合。]
2. 创建SessionFactory类的实例,把Configuration对象中所有配置信息复制到SessioFactory的缓存中。SessionFactory的实例代表一个数据库存储源,创建之后将不会再与configuration对象关联。
3. 调用SessionFactory创建Session对象的方法。
4. 通过Session接口提供的各种数据库操作的方法来操纵数据库访问。
5. 执行完数据库操作之后,提交数据库操作的结果。
6. 关闭Session对象。
SessionFactory
是一个单实例对象,是线程安全的,所有由该工厂生产的session都共享工厂中维护的数据。多个线程同时访问时,不会出现线程并发问题,它还用于缓存配置信息(数据库配置信息,映射文件,预定义HQL语句等)SessionFactory用锁机制确保每次只释放一个session对象。
SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。
Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。
注意:
1> getCurrrentSession();该方法获取的是与当前线程绑定的session,获取的是同一个session,需要在主配置中添加配置,而且不需要手动关闭session。
<property name="hibernate.current_session_context_class">thread</property>
2> openSession();每次获取的都是不同的session
为什么SessionFactroy是线程安全的?
因为它在项目启动的时候加载一次,且没有公用的变量,不会出现多并发问题。