1. sessionFactory
顾名思义,sessionFactory,就是用来创建session会话的工厂。想想有一个特别大的工厂,专门用来在你需要使用session的时候,让它帮你创建一个就好了。
- 用来产生和管理session。
- 通常情况下每个应用只需要一个sessionFactory。
- 除非访问多个数据库的情况。
SessionFactory重量级的,一个线程中只能有一个,并且是线程安全的。Hibernate的Session线程不安全,故不能在多个线程中共享。
- 关注两个方法:
名称 区别 openSession() 1.永远创建新的session。2.在单线程环境中,它比getCurrentSession慢。3.需要显式刷新和关闭会话对象。4.不需要配置任何属性来调用此方法。 getrCurrentSeesion() 1.commit之前还是原来的,commit之后新建一个session, 但是不用close session, Hibernate会帮你完成。2.您需要配置其他属性。 “hibernate.current_session_context_class”来调用getCurrentSession方法,否则会抛出异常。 hibernate.current_session_context_class有几个取值:
- jta: 分布式事物 (Java Transction API)
- thread: 线程事物管理,一般但数据库的项目采用这个配置。
<property name="hibernate.current_session_context_class">thread</property>
- managed:用的不多。
- a custom class implementing org.hibernate.context.spi. CurrentSessionContext
2. 对象的三种状态
对象的三种状态.png
三种状态:
1.瞬时状态(Transient)
通过New创建对象,对象没有立即持久化,此时Java对象的状态为瞬时状态。Session对瞬时状态的java对象是一无所知的,此对象不在被别的对象引用时,java虚拟机会在一定时间段回收次对象。
2.持久状态(Persistent)
当对象与Session关联,被Session管理时,该对象就处于持久状态。
3.游离状态(Detached)
处于持久状态的对象,脱离与其关联的Session管理后,对象就处于游离状态。
判断方法:
- Transient:内存中有一个对象,缓存中没有,数据库中也没有。
- Persistent:内存有,缓存有,数据库有。
- Detached:内存有,缓存没有,数据库有。
状态转换:
- 瞬时状态转为持久状态
通过Session对象的save()、saveOrUpDate()方法保存对象或者使用get()、load()方法获取对象。- 持久状态转为瞬时状态
执行Session的delete()方法后,对象由持久状态转为瞬时状态。- 持久状态转为游离状态
执行Session的evict()、clear()、close()方法,对象由持久状态转为游离状态。- 游离状态转为持久状态
重新获取Session对象,执行Session对象的update()、saveOrUpdate()方法将对象从游离状态变为持久状态,也就是说通过这两个方法,可以将对象重新与Session关联。- 游离状态转为瞬时状态
执行Session的delete()方法。
3. Hibernate 核心API
3.1 flush()
- session.flush() : 让一级缓存与数据库同步
- session.evict(arg0) : 清空一级缓存中指定的对象
- session.clear() : 清空一级缓存中缓存的所有对象
3.2 clear()
- 批量操作使用使用:
- Session.flush(); // 先与数据库同步
- Session.clear(); // 再清空一级缓存内容
3.3 get()
- 立即发送Sql语句
3.4 load()
- 不立即发送Sql语句
- 生成的是代理对象
具体的差别可以参考以下链接:Hibernate的get和load3.5 update()
如果想修改对象的单个属性不是全部更新的话:
- xml设定property标签为dynamic-update, annotation没有对应属性;
- 不同的session之间,可以用 merge()方法;
- HQL也可以