休眠中的驱逐和分离有什么区别?

Zak*_*zza 5 java hibernate

evict我在理解和之间的区别时遇到了一些困难detachevict无论如何都会分离会话,如果是的话,有什么区别?我读到它从二级缓存中删除了对象,但没有得到它。

Ste*_*rnK 6

实际上,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)


Gov*_*are 5

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用于从一级缓存中删除对象