您当前的位置: 首页 >  hibernate

liaowenxiong

暂无认证

  • 2浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Hibernate中的实体对象的三种状态

liaowenxiong 发布时间:2022-07-02 21:28:07 ,浏览量:2

对于 Hibernate 而言,实体对象的状态分为三种: 1.暂时态 当对象刚创建,和 Session 没有发生任何关系时,当程序运行完就立刻消失,被称为暂时态。

2.持久态 持久态的对象和 Session 发生了关系,如执行了 session.save()session.get()session.query() 等方法

  • Session 中会缓存该对象(Session 的缓存叫一级缓存)
  • Session 获取对象时,首先去查找一级缓存,如果没有才查询数据库
  • Session 要负责将持久态对象的变化更新到数据库(在执行 session.flush() 时才会将更新同步到数据库中,提交事务时会自动调用session.flush()

对象处于缓存中,那么对象就处于持久化状态;将对象从缓存中移除,对象就不再处于持久化状态!

3.游离态 调用了 session.evict(Object obj) 方法,和 Session 解除了关系,之后实体对象会被垃圾回收掉。evict() 方法用于将实体对象从 Session的一级缓存中清除出去,从而及时释放它占用的内存。

测试代码:

/**
   * Hibernate中的实体对象的三种状态(暂时态、持久态、游离态)
   *
   * @param
   * @return
   * @throws
   * @author liaowenxiong
   * @date 2022/7/2 20:21
   */
  @Test
  public void testPersistence() throws ParseException {
    Employee emp = new Employee();
    emp.setName("liaowenxiong");
    emp.setNickname("liaowenxiong");
    String str = "2018-08-22";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date date = sdf.parse(str);
    emp.setHiredate(date);
    Timestamp timestamp = Timestamp.valueOf("2017-02-23 18:25:38");
    emp.setEntryTime(timestamp);
    emp.setSalary(new BigDecimal("7899.00"));
    emp.setAge((byte) 22); // 现在emp是暂时态
    Session session = HibernateUtils.getSession();
    Transaction tx = session.beginTransaction();
    session.save(emp); // 现在的emp是持久态,因为已经将对象emp中的数据插入到数据库中了,如果没有提交,在数据表中是查看不到的
    emp.setAge((byte) 89);// 虽然emp是持久态,但是并不会自动将更新同步到数据库中,只有执行session.flush()才会同步到数据库中
    tx.commit();// commit()会调用session.flush()
    session.close();
  }

关注
打赏
1661566967
查看更多评论
立即登录/注册

微信扫码登录

0.0445s