Hibernate中如何实现对象状态的转换?代码举例讲解

在Hibernate中,对象状态转换指对象从瞬时状态(transient)转换到持久状态(persistent)的过程。主要有以下几种实现方式:

  1. 保存新对象:对一个瞬时对象调用Session的save()或saveOrUpdate()方法进行保存,会将其转换为持久对象,并分配对象识别符(OID)。

例如:

Customer customer = new Customer();   // 瞬时对象
customer.setName("John");

session.save(customer);   // 保存,转换为持久对象
  1. 查询后修改:对查询得到的持久对象进行修改,将自动重新与会话绑定,变为脏对象(dirty)。在事务提交时会同步到数据库。

例如:

Customer customer = session.get(Customer.class, 1);   // 持久对象
customer.setName("Peter");   // 修改,转换为脏对象

session.flush();   // 提交,同步到数据库
  1. 重新加载脏对象:对一个脏对象调用Session的refresh()方法可以重新加载数据库的最新数据,对象状态转换回持久对象。

例如:

Customer customer = session.get(Customer.class, 1);  
// 其他事务更新了name字段

session.refresh(customer);   // 重新加载,转换回持久对象  
  1. Session合并:当我们调用session.merge()方法,传入一个瞬时对象或脱管对象(detached)时,Hibernate会转换其为持久对象。

例如:

Customer customer = new Customer();  
// 在其他事务中操作过customer,现在是脱管对象  

Customer merged = (Customer) session.merge(customer);  
// 合并,转换为持久对象