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