时间:2017-1-19 23:00
——Hibernate持久化类的状态
1、持久化类:就是一个实体类与数据库建立了映射。
2、Hibernate为了方便管理持久化类,将持久化类分为了三种状态:
1)瞬时态:transient(临时态)
2)持久态:persistent
3)脱管态:detached(离线态)
——三种持久化对象的状态
1、三种持久化对象的状态
1)瞬时态
不存在持久化标识OID,尚未与Hibernate Session关联对象,被认为处于瞬时状态,失去引用将被JVM回收。
无持久化标识OID,未与Session关联。
2)持久态
存在持久化标识OID,与当前Session有关联,并且关联的Session没有关闭,事务未提交。
存在持久化标识OID,与Session关联。
持久化对象有自动更新数据库的能力。
3)脱管态
存在持久化OID,但没有与当前Session关联,脱管状态改变时Hibernate无法检测。
存在持久化标识OID,未与Session关联。
2、区分三种持久化对象的状态
示例代码:
public class HibernateDemo1 {
@Test
/*
* 区分持久化对象的三种状态:
*/
public void fun1(){
// 1、创建Session
Session session = HibernateUtils.openSession();
// 2、开启事务
Transaction tx = session.beginTransaction();
/*
* 3、逻辑操作
*/
// 向数据库中保存一本图书
Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与Session关联
book.setName("Hibernate");
book.setAuthor("张三");
book.setPrice(50D);
session.save(book); // book变为一个持久态对象,有唯一标识OID,与Session关联
// 4、提交事务
tx.commit();
// 5、施放资源
session.close();
book.setName("Struts2"); // 此时book就是脱管态了,有唯一标识OID,但与Session无关联
}
}
3、三种状态对象的转换
瞬时态:
Book book = new Book();
1)瞬时态 ——> 持久态
Book book = new Book();
session.save(book);
2)瞬时态 ——> 脱管态
book.setId(1); // 设置OID
持久态:
Book book = (Book)session.get(Book.class, 1);
get() / load() / find() iterate()
1)持久态 ——> 瞬时态
session.delete(book); // 删掉之后就没有OID了
2)持久态 ——> 脱管态
session.close()
clear() / evict(book) 将Session中的指定对象删除。
脱管态:
Book book = new Book();
book.setId(1);
1)脱管 ——> 持久
session.update(book);
2)脱管 ——> 瞬时
book.setId(null);
——持久态对象自动更新数据库
示例代码:
/*
* 持久态对象自动更新数据库
*/
public void fun2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 获得一个持久态对象
Book book = (Book)session.load(Book.class, 1);
book.setName("Struts2");
tx.commit(); // 当提交时会发送一条update语句,自动更新数据库数据,依赖的是Hibernate的一级缓存
session.close();
}
——总结
1、Hibernate持久化对象的状态:
* 瞬时态
没有唯一标识OID,没有与Session关联
* 持久态
有唯一标识OID,与Session关联
* 脱管态
有唯一标识OID,没有与Session关联
2、瞬时态对象
User user = new User()
瞬时态-->持久态
session.save(user)
瞬时态-->脱管态
user.setId(1)
3、持久态对象
get() / load()
持久态-->瞬时态
session.delete(Object)
持久态-->脱管态
session.close() / session.clear() / session.evice()
4、脱管态
User user = new User();
user.setId(1)
脱管态-->瞬时态
user.setId(null)
脱管态-->持久态
save() / saveOrUpdate()