-
持久化类的三种状态
hibernate是持久化框架,通过持久化类完成ORM操作。hibernate为了更好的管理持久化类,将持久化类分成三种状态。
持久化类=Java类+映射
-
瞬时态(transient)
- 这种对象没有唯一标识符OID,还没有被session管理,这种对象被称之为瞬时态对象。
-
持久态(persistent)
- 这种对象有唯一标识符OID,被session管理,这种对象称之为持久态。
- 持久化类的持久化对象,可以自动更新数据库。
- 这种对象有唯一标识符OID,被session管理,这种对象称之为持久态。
-
托管态(detached)
- 这种对象有唯一标识符OID,没有被session管理,称之为托管态。
-
区分三种状态对象
public class HibernateDemo2 {
// 三种状态转换
@Test
public void demo1() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();// 瞬时态对象:没有唯一标识符OID,没有被session管理。
customer.setCust_name("张三");
Serializable id = session.save(customer); // 持久态对象:有唯一标识符,被session管理。
transaction.commit();
session.close();
System.out.println("顾客姓名:" + customer.getCust_name());// 托管态对象:有唯一标识符,没有被session管理。
}
}
-
持久化的状态转换
三种状态转换图 -
瞬时态对象
- 获取途径
- Customer customer = new Customer();
- 状态转换
- 瞬时-->持久
- save(Object obj)
- saveOrUpdate(Object obj)
- 瞬时-->托管
- customer.setCust_id(1l);//托管有唯一标识符OID
- 瞬时-->持久
- 获取途径
-
持久态对象
- 获取途径
- get()
- Customer customer = session.get(Customer.class,1l);
- load()
- Customer customer = session.load(Customer.class,1l);
- find()
- iterate()
- get()
- 状态转换
- 持久-->瞬时
- delete()
- 持久-->托管
- close()
- clear() : 清空所有
- evict(Customer customer) : 清空某一个对象
- 持久-->瞬时
- 获取途径
-
托管态对象
- 获取途径
- Customer customer = new Customer();
- customer.setCust_id(1l);
- 状态转换
- 托管-->持久
- update();
- saveOrUpdate();
- lock();
- 托管-->瞬时
- customer.setCust_id(null);
- 托管-->持久
- 获取途径
-
@Test
// 保存或更新
public void demo2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
/*Customer customer = new Customer(); //瞬时态
customer.setCust_name("James");
session.saveOrUpdate(customer);*/ //持久态(执行save转化为持久态)
Customer customer = new Customer(); //瞬时态
customer.setCust_id(3l); //托管态(设置唯一标识符OID,但是没有被session管理)
customer.setCust_name("Lebron");
session.saveOrUpdate(customer); //持久态(执行update转化为持久态)
tx.commit();
session.close();
}
-
持久态对象特性
-
持久态对象可以自动更新数据库
// 持久态对象可以自动更新数据库 @Test public void demo2() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); // 获得持久态对象 Customer customer = session.get(Customer.class, 1l); customer.setCust_name("king"); // session.update(customer); //注释这条语句依然可以更新数据库(依赖hibernate的一级缓 存) transaction.commit(); session.close(); }
-