一、三种状态的简述
Hibernate里有三种对象状态:临时状态 (Transient)、持久状态(Persistent)、游离状态(Detached)持久状态对象也叫PO (PersistentObject) 临时状态和游离状态的对象也叫VO(ValueObject)。
二、瞬时状态
瞬时状态的实例是有new命令创建,开辟内存空间的对象,不存在Id(相当于主键值),尚未与Session关联,在数据库中也没有记录,失去引用后自动被JVM回收,瞬时状态的对象在内存中是孤立存在的,与数据库中的数据无任何关联,仅仅是一个信息携带的载体。
例如:
//瞬时状态
Person person = new Person();//无Id,并没有在session缓存中
person.setName("JumpLin");
person.setAge(19);
person.setBirthday(new Date());
System.out.println("===========打印瞬时状态下的Person对象");
System.out.println(person.toString());
打印结果:
三、持久状态
持久状态存对象存在Id,加入到了Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录,每条记录只对应唯一的持久对象,需要注意的是,持久状态对象是在事务还为提交前变成持久状态的。 session.get()或者session.loda()获取的对象直接是持久对象,如果想把瞬时状态对象转换到持久对象通过session.save()方法将实体对象保存到数据库中然后在和session绑定关联。
例如:
// 此时对象属于无Id,没有于session建立关联的瞬时状态
Person person = new Person();
person.setName("JumpLin");
person.setAge(19);
person.setBirthday(new Date());
//使用session.save()方法将实体对象转换为持久状态,并将属性存储到数据库中
session.save(person);
System.out.println("===========打印持久状态下的Person对象");
System.out.println(person.toString());
打印结果:
四.游离状态
当持久状态的实例,与Session的关联被关闭时就变成了游离状态。游离状态对象存在id,并且仍然与数据库中的数据存在关联,只是失去了与当前Session的关联,游离状态对象发生变化时Hibernate不能检测到。
//关闭session
session.close();