现在的位置: 首页 > 综合 > 正文

Hibernate 对象的三种状态 (详解)

2013年12月07日 ⁄ 综合 ⁄ 共 888字 ⁄ 字号 评论关闭

hibernate中对象的三种状态

持久态对象的标志是它有id值,并且会被存入session的一级缓存。特点是对它们的操作hibernate是能够知道的并且在调用session.flush()方法时将对它们的更新操作(如obj.setXxx()方法)同步到数据库。在调用commit()方法前会自动调用flush()方法,用户也可以自己调用flush()方法。调用session.clear()方法会清空一级缓存,将所有的持久化对象变为脱管的,因此调用clear()方法前一定要调用session.flush()方法,将一级缓存中的持久化对象同步到数据库。

 

脱管对象与瞬时对象都不在hibernate的管理中,它们的区别是脱管对象有id值,数据库中有记录和它对应,但瞬时对象没有id值也没有数据库记录和它对应。

 

要强调的是瞬时对象调用session.save(obj)方法后对象虽然变为持久态的,有id值,但是此时数据库中不一定有一条记录和对象对应。如果对象的主键生成策略是“native”,那么hibernate使用数据库自身的机制生成主键(mysql是auto_increment,oracle使用squence机制),这时只有当数据插入到数据库后才会得到它的主键,因此会在session.save(obj)方法时向数据库发送insert语句,因此session.save(obj)后数据库中有记录和对象对应,但是如果对象的主键生成策略是“uuid”或“hilo”,这时要生成对象的id不需要将对象插入数据库(uuid方式不需要访问数据库,根据主机IP等信息生成,hilo方式hiberhinate维护数据库中一张用于生成id的表),这时session.save(obj)后对象有id值,但数据库中没有记录和它对应,只有调用flush()方法后才会发送insert语句,将对象和数据库同步

总结来看:

三种状态:

Transient:瞬时态,内存中的一个对象,没有ID,缓存中也没有;

Persistent:持久态,内存中有,缓存中有,数据库中有ID

Detached:脱管态,内存中有,缓存中没有,数据库中有ID






抱歉!评论已关闭.