evict我在理解和之间的区别时遇到了一些困难detach,evict无论如何都会分离会话,如果是的话,有什么区别?我读到它从二级缓存中删除了对象,但没有得到它。
实际上,EntityManager.detach和 hibernateSession.evict做同样的事情:
...从一级缓存中删除对象及其集合
从hibernate的实现中org.hibernate.Session我们可以看到该detach方法对方法进行了内部调用evict。
public final class SessionImpl {
// ...
@Override
public void detach(Object entity) {
checkOpen();
try {
evict( entity );
}
catch (RuntimeException e) {
throw exceptionConverter.convert( e );
}
}
}
Run Code Online (Sandbox Code Playgroud)
orsession.evict()方法entityManager.detach()可用于从first-level缓存中删除对象。
为什么要从缓存中逐出实体?
当该flush()方法被调用时,实体的状态被保存在数据库中。如果您正在处理大量对象并且需要有效地管理内存,则应该逐出实体。
从会话中驱逐实体Hibernate:
for(Person person : (List<Person>) session.createQuery("select p from Person p")
.list()) {
dtos.add(toDTO(person));
session.evict( person );
}
Run Code Online (Sandbox Code Playgroud)
从 中分离实体EntityManager:
for(Person person : entityManager.createQuery("select p from Person p", Person.class)
.getResultList()) {
dtos.add(toDTO(person));
entityManager.detach( person );
}
Run Code Online (Sandbox Code Playgroud)
如果您想从second-level缓存中清除该条目,可以按以下方式执行:
entityManagerFactory.getCache().evict(..);
Run Code Online (Sandbox Code Playgroud)
或者
sessionFactory.getCache().evict(..);
Run Code Online (Sandbox Code Playgroud)
TL;DR detach以及evict用于从一级缓存中删除对象
| 归档时间: |
|
| 查看次数: |
1883 次 |
| 最近记录: |