hibernate中对象状态
- hibernate对象分为三种状态
- 瞬时状态
- 没有id,没有在session缓存中 (在实体对象new出来的时候,内存中开辟内存空间的对象,不存在持久化表示的ID(相当于表中的主键值),没有和 hibernate session关联,在数据库中也没有记录,失去引用后被JVM垃圾回收机制回收.瞬时状态的对象是在内存中独立存在的,与数据库中的数据没有任何关联)
- 持久化状态
- 有id,在session缓存中 (持久化对象存在持久化标识ID,加入到了session缓存中,并且相关联的session没有关闭,在数据库中有对应的记录,每条记录只能对应唯一 的持久化对象,要注意,持久化对象是在事物还没有提交前变成持久化的)
- 游离状态(托管状态)
- 有id没有在session缓存中 (游离状态也可以叫做托管状态,当某一个持久化状态的实例与session的关联被关闭是就变成了游离状态.游离状态对象在持久化ID,并且依然与数据库中的数据库在存在关联,只是失去了当前session的关联,游离状态发生改变时hibernate不能检测到)
- 瞬时状态
下面是图片捋一下从中的关系:
从图中可以看出,当一个对象被执行new 关键字创建后,对象出于瞬时状态,当对瞬时状态对象执行save(),saveOrUpdate()方法后,把改对象放到session的一级缓存中(hibernate一级缓存会在<
User u = new User();瞬时状态
u.setId(1);//游离状态
持久化状态对象能够自动更新到数据库
- 上面我一级介绍了hibernate对象的三中状态,其实我们主要是去研究持久化状态就够了, 持久化状态对象有一个非常重要的特性:持久化对象可以自动更新到数据库
@Test
public void demo(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//获得持久化对象
User u = session.get(User.class,1l)//1L因为我的ID是long类型的
u.setName("张三");
//session.update(u);//不用手动调用update方法就可以更新数据库
tx.commit();
session.close();
}
执行测试我们会发现,我们没有调用update方法, Hibernate就可以讲数据库制动更新. 持久化对象就有这样的一个功能,持久化对象能有这样的一个功能都是依赖Hibernate的一级缓存.