Hibernate缓存和CRUD操作

1.文章转载于:http://www.techrss.cn/html/2008/04-08/79497.htm

 

 

 

2.1 Hibernate实体对象的三种状态

     (1)Transient:所谓Transient就是说实体对象在内存中存在,与数据库的记录无关。

     (2)Persient:Persient对象对应数据库中的一条记录,也可以这样子理解,如果一个实体对象与某个session发生关联,并处于对应session的有效期内,那么它就处于Persient状态。

     (3)Detached:所谓Detached就是处于Persient状态对应的session关闭之后的状态。

 

      我们平时所说的PO(持久化对象)指的是位于Persient状态的对象,而VO(值对象)就是指Transient和Detached状态的对象。

 

 

2.2CRUD

     (1)save()方法,调用save方法时,首先会在session缓存中查找保存对象,如果实体对象已经处于Persient状态,则直接返回,否则执行SQL操作,将保存的实体对象加入session缓存中(save方法不会把实体加入到二级缓存的),最后对存在的级联关系进行递归处理。

     (2)saveOrUpdate()方法:和save一样首先在session缓存中查找,判断对象是否为保存状态,如果对象处于Persient,不执行操作,处于Transient执行save操作,处于Detached调用save将对象与session重新关联。

 

      这里要注意的是在批量操作时要适时地对session进行flush操作,避免出现OutOfMemoryError。(开发中设置一个计数器,到达某个临界值的时候就清空一次就可以啦)

 

2.3 查询

      查询是受缓存影响最大的。

      (1)session的load()和get():这两者的区别主要是load会在二级缓存中查找,而get在内容缓存中查找不到的话将跳过二级缓存直接进行SQL操作。

      (2)Query的list()和iterate()方法:list实际上无法使用缓存,它对缓存只写不读,而iterate则是首先查找所有符合条件的id(首先在本地缓存中查找)在执行相应的select获得对应记录,iterate方法的使用是查找的实体对象在缓存中已经存在了,否则查询性能很低,容易产生N+1现象

 

 

发布了38 篇原创文章 · 获赞 0 · 访问量 1751
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章