如果我们有session.evict(),为什么我们需要javax.persistence.EntityManager.detach()?

时间:2018-05-29 10:04:13

标签: hibernate session

select count(fl.fact_listing_id) as Count , dr.region_id , dc.category_id , fl.created_at_date_id from fact_listing fl right JOIN dim_region dr on fl.region_id = dr.region_id right JOIN dim_category dc on fl.category_id = dc.category_id right JOIN dim_date dd on fl.created_at_date_id = dd.date_id group by fl.created_at_date_id ,dr.region_id ,dc.category_id; 方法与上述两种方法的区别是什么?

session.evict(),

之间有什么区别

javax.persistence.EntityManager.detach()和

javax.persistence.EntityManager.remove(),session.delete()?

1 个答案:

答案 0 :(得分:3)

这三种方法用于非常不同的事情。

  1. remove()标记要删除的持久实体,表示at 刷新时间hibernate将生成相应的sql删除 言。
  2. evict()用于从内部缓存中删除实体 (休眠一级缓存)。如果从db加载实体,hibernate会将其存储在缓存中,后续查询将首先命中缓存。驱逐实体强制hibernate再次查询db
  3. 如果要使实体不受管理,则使用
  4. detach()。你基本上 告诉hibernate停止跟踪该实体修改(脏检查),这样如果您以任何方式更新它的字段,您将不会在db上反映这些更改。