Метод 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-го уровня