在Hibernate中,对象状态转换指对象从瞬时状态(transient)转换到持久状态(persistent)的过程。主要有以下几种实现方式:
- 保存新对象:对一个瞬时对象调用Session的save()或saveOrUpdate()方法进行保存,会将其转换为持久对象,并分配对象识别符(OID)。
例如:
Customer customer = new Customer(); // 瞬时对象
customer.setName("John");
session.save(customer); // 保存,转换为持久对象
- 查询后修改:对查询得到的持久对象进行修改,将自动重新与会话绑定,变为脏对象(dirty)。在事务提交时会同步到数据库。
例如:
Customer customer = session.get(Customer.class, 1); // 持久对象
customer.setName("Peter"); // 修改,转换为脏对象
session.flush(); // 提交,同步到数据库
- 重新加载脏对象:对一个脏对象调用Session的refresh()方法可以重新加载数据库的最新数据,对象状态转换回持久对象。
例如:
Customer customer = session.get(Customer.class, 1);
// 其他事务更新了name字段
session.refresh(customer); // 重新加载,转换回持久对象
- Session合并:当我们调用session.merge()方法,传入一个瞬时对象或脱管对象(detached)时,Hibernate会转换其为持久对象。
例如:
Customer customer = new Customer();
// 在其他事务中操作过customer,现在是脱管对象
Customer merged = (Customer) session.merge(customer);
// 合并,转换为持久对象