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

对于 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();
  }

猜你喜欢

转载自blog.csdn.net/liaowenxiong/article/details/125577682
今日推荐