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

Nin*_*avi 3 session hibernate

javax.persistence.EntityManager.remove()该方法与上述两种方法有何不同?

session.evict() 之间有什么区别,

javax.persistence.EntityManager.detach() 和

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

Zer*_*mus 5

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

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