OID=Object ID。数据封装对象(JavaBean)的三个状态由 是否有OID、是否与session关联 决定。
1.状态说明:
-> 瞬时态 transient:没有持久化标识OID,未与Session关联。临时对象。
-> 持久态 persistent:具有持久化标识OID,与Session关联(处于事务中)。有效对象。
-> 脱管态 detached:具有持久化标识OID,脱离Session关联。“无效”对象。
public void test() {
Session session = UtilGetSession.openSession();
Transaction transaction = session.beginTransaction();
/** 没有OID,未与session关联。瞬时态 **/
PojoUser user = new PojoUser();
user.setName("Eminem");
user.setAge(45);
user.setCity("Detroit");
/** 有OID,与session关联。持久态 **/
session.save(user); /** Bean的setID方法产生OID,session的save与之关联 **/
transaction.commit();
/** 有OID,但脱离与session关联。脱管态 **/
session.close();
}
2.状态转换:
1)直接获得瞬时对象
相关操作:new Book()
瞬时 ---> 持久 save、saveOrUpdate 插入操作
瞬时 ---> 脱管 book.setId(1);设置OID
2)直接获得持久对象
相关操作:查询操作、get/load、Query、Criteria
持久 ---> 瞬时 delete 删除操作(删除对象后,OID无效)
持久 ---> 脱管 提交事务/关闭Session、session.clear()、session.evict(obj)
3)直接获得脱管
相关操作:无法直接获得
脱管 ---> 瞬时 book.setId(null);移除对象OID
脱管 ---> 持久 update 更新操作
- end