对于 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*/@Testpublic 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();}