`
comeonbabye
  • 浏览: 438785 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate中对象的三种状态

阅读更多
标签:

hibernate

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语句, 将对象和数据库同步。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics