什么是 Hibernate 的 Session
- Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection
持久化类与 Session 关联起来后就具有了持久化的能力。
- 取得持久化对象的方法: get(), load()
- 持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
- 开启事务: beginTransaction()
- 管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等
Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应. Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush)
在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期,Session 缓存可减少 Hibernate 应用程序访问数据库的频率。
持久化对象的状态
站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到另一个状态.
临时对象(Transient):
1.在使用代理主键的情况下, OID 通常为 null
2.不处于 Session 的缓存中
3.在数据库中没有对应的记录持久化对象(也叫”托管”)(Persist):
1.OID 不为 null
2.位于 Session 缓存中
3.若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应
4.Session 在 flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
5.在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象- 删除对象(Removed)
1.在数据库中没有和其 OID 对应的记录
2.不再处于 Session 缓存中
3.一般情况下, 应用程序不该再使用被删除的对象 - 游离对象(也叫”脱管”) (Detached):
1.OID 不为 null
2.不再处于 Session 缓存中
3.一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录 - 测试 session 的一部分方法
class TestHibernate {
private SessionFactory sessionFactory = null;
private Session session = null;
private Transaction transaction = null;
/**
*
* @MethodName: init
* @Description: TODO (执行每次@Test 方法前需要执行的方法)
* @Return Type: void
* @Author: zc-cris
*/
@BeforeEach
public void init() {
//在5.1.0版本汇总,hibernate则采用如下新方式获取:
//1. 配置类型安全的准服务注册类,这是当前应用的单例对象,
//不作修改,所以声明为final
//在configure("cfg/hibernate.cfg.xml")方法中,
//如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure("/hibernate.cfg.xml").build();
// 2. 根据服务注册类创建一个元数据资源集,
//同时构建元数据并生成该应用唯一(一般情况下)的一个session工厂
this.sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
//