В чем разница между выселением и отключением в спящем режиме? - PullRequest
2 голосов
/ 07 февраля 2020

У меня возникли некоторые проблемы с пониманием разницы между evict и detach, отсоединяет ли evict сеанс в любом случае, если так, то в чем разница? Я прочитал, что удаляет объект из кэша второго уровня, но не получил его.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020

На самом деле EntityManager.detach и hibernate Session.evict делают одно и то же вещь :

... удаляют объект и его коллекции из кэша первого уровня

Из реализации спящего режима 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 );
        }
    }
}
2 голосов
/ 07 февраля 2020

Метод session.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 );
}

Отсоединение сущности от EntityManager:

for(Person person : entityManager.createQuery("select p from Person p", Person.class)
        .getResultList()) {
    dtos.add(toDTO(person));
    entityManager.detach( person );
}

Если вы хотите выселить запись из кэша second-level вы можете сделать это следующим образом:

entityManagerFactory.getCache().evict(..);

ИЛИ

sessionFactory.getCache().evict(..);

TL; DR detach, а также evict используется для удаления объекта из кэша 1-го уровня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...