5 votes

Quelle est la différence entre évacuer et détacher dans Hibernate?

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.

6voto

SternK Points 561

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 );
        }
    }
}

4voto

govi Points 22

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X