`
zcw_java
  • 浏览: 298296 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate中增删查改与session周期

 
阅读更多
Hibernate中的增删查改操作都是通过session的方法进行
一、查询
session中查询有两种方法:get和load
这两种方法都是返回实体对象,不同的是!如果未发现符合条件的记录,get会返回null而load会抛出一个ObjectNotFoundException异常。
load方法可返回实体的代理类实例,而get方法永远直接返回实体类
load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如果没有发现数据,将越过二级缓存,直接调用sql完成数据读取,有人称之为“懒加载”。

get方法首先查询session缓存,没有结果!在查询二级缓存,最后查询数据库!
load方法首先查询session缓存,没有结果!创建代理,实际使用数据的时候才查询二级缓存和数据库.

二、保存
首先理解实体对象的三种状态:
瞬时状态:new出来了,但没被session管理,数据库里不存在!
持久状态:对象有实例,session也管理,数据库有记录!
游离状态:脱离session的管理,但数据库有记录!
其实子要理解为:Hibernate三个阶段
1>未被hibernate处理
2>正在被hibernate处理
3>处理之后
save和persist方法:
都是用来保存数据,区别在没开启事务时,persist方法不向数据库插入数据,不会产生insert语句;save方法在没有开启事务时会向数据库插入数据,但会回滚,所以数据库里没有数据。

有人会说obj.save();  obj.setName("aaa");  t.commit();这种hibernate会自动检测到对象发生变化,没错!因为hibernate为提高效率,减少与数据库交互,commit的时候才会对持久化对象检测!

通过evict()/close()/clear()把持久化状态变成脱管状态
通过get()或者load()或者find()或者iterate()等都能取得持久化状态的对象
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics