Hibernate 学习之路(二): Hibernate中的Session详解和持久化对象(一)

什么是 Hibernate 的 Session
  • Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection
  • 持久化类与 Session 关联起来后就具有了持久化的能力。

    1. 取得持久化对象的方法: get(), load()
    2. 持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
    3. 开启事务: beginTransaction()
    4. 管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等
  • Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应. Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush)

  • 在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期,Session 缓存可减少 Hibernate 应用程序访问数据库的频率。

持久化对象的状态
  • 站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到另一个状态.

    1. 临时对象(Transient):
      1.在使用代理主键的情况下, OID 通常为 null
      2.不处于 Session 的缓存中
      3.在数据库中没有对应的记录

    2. 持久化对象(也叫”托管”)(Persist):
      1.OID 不为 null
      2.位于 Session 缓存中
      3.若在数据库中已经有和其对应的记录, 持久化对象和数据库中的相关记录对应
      4.Session 在 flush 缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
      5.在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象

    3. 删除对象(Removed)
      1.在数据库中没有和其 OID 对应的记录
      2.不再处于 Session 缓存中
      3.一般情况下, 应用程序不该再使用被删除的对象
    4. 游离对象(也叫”脱管”) (Detached):
      1.OID 不为 null
      2.不再处于 Session 缓存中
      3.一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录
    5. 测试 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();
//      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值