Je rencontre un peu de difficulté à comprendre la différence entre evict
et detach
, est-ce que evict
détache quand même la session, si oui quelle est la différence? J'ai lu que cela supprime l'objet du cache de deuxième niveau mais je n'ai pas compris.
Réponses
Trop de publicités?En fait, EntityManager.detach
and hibernate Session.evict
font la même chose:
... retirent l'objet et ses collections du cache de premier niveau
À partir de l'implémentation hibernate de org.hibernate.Session
, on peut voir que la méthode detach
fait un appel interne à la méthode evict
.
public final class SessionImpl {
// ...
@Override
public void detach(Object entity) {
checkOpen();
try {
evict( entity );
}
catch (RuntimeException e) {
throw exceptionConverter.convert( e );
}
}
}
La méthode session.evict()
ou entityManager.detach()
peut être utilisée pour supprimer l'objet de la cache de premier niveau
.
pourquoi exclure les entités de la cache?
Lorsque la méthode flush()
est appelée, l'état de l'entité est enregistré dans la base de données. Vous devez exclure les entités si vous traitez un grand nombre d'objets et avez besoin de gérer la mémoire de manière efficace.
Exclure une entité de la session Hibernate
:
for(Personne personne : (List) session.createQuery("select p from Personne p")
.list()) {
dtos.add(toDTO(personne));
session.evict( personne );
}
Détacher une entité de l'EntityManager
:
for(Personne personne : entityManager.createQuery("select p from Personne p", Personne.class)
.getResultList()) {
dtos.add(toDTO(personne));
entityManager.detach( personne );
}
Si vous voulez exclure l'entrée de la deuxième niveau
cache, vous pouvez le faire de la manière suivante:
entityManagerFactory.getCache().evict(..);
OU
sessionFactory.getCache().evict(..);
TL;DR détacher
ainsi que exclure
est utilisé pour supprimer l'objet de la cache de premier niveau