2014-05-06 12 views
5

Chciałbym wydajnie załadować wiele obiektów z DB, korzystając z pamięci podręcznej sesji hibernatów (1. poziom pamięci podręcznej nie 2. poziom). Starałem się zrobić coś jak następuje:Jak ustalić, czy obiekt istnieje już w pamięci podręcznej sesji w trybie hibernacji, mając identyfikator jednostki?

List<T> getEntities(Class<T> clazz, Collection<Long> ids) { 
    ArrayList<T> result = new ArrayList<T>(ids.size()); 

    for (Long id : ids) { 
    if (session.containsEntity(clazz, id)) 
     result.add((T) session.get(clazz, id)); 
    else 
     idsToFetch.add(id); 
    } 

    if (CollectionUtils.isNotEmpty(idsToFetch)) { 
    List<T> fetchedEntities = 
     session.createCriteria(clazz).add(Restrictions.in("id", idsToFetch)).list(); 
    result.addAll(fetchedEntities); 
    } 
    return results; 
} 

Problem z powyższego jest to, że containsEntity nie istnieje w klasie sesji. Kiedy patrzę na to w debugerze, widzę informacje w klasie (w klasie persistentContext), po prostu widzę, jak się do niego dostać.

- Aktualizacja: Tu było rozwiązanie użyłem po przeczytaniu odpowiedzi, nie wiem, czy jest lepszy czy nie

ClassMetadata metadata = _sessionFactory.getClassMetadata(clazz); 
SessionImpl session = (SessionImpl) _sessionFactory.getCurrentSession(); 
EntityPersister persister = session.getFactory().getEntityPersister(metadata.getEntityName()); 

PersistenceContext context = session.getPersistenceContext(); 

List<Serializable> idsToFetch = new ArrayList<Serializable>(ids.size()); 

for (Serializable id : ids) { 
    EntityKey entityKey = new EntityKey(id, persister, EntityMode.POJO); 
    T entity = (T) context.getEntity(entityKey); 
    if (entity != null) 
    result.add(entity); 
    else 
    idsToFetch.add(id); 
} 

Odpowiedz

2

Można użyć Session.getStatistics(), a następnie analizować EntityKey s zestaw pochodzi z SessionStatistics.getEntityKeys() .

+1

Dzięki. To doprowadziło mnie do innego rozwiązania, ponieważ potrzebowałem również stworzenia EntityKey, którego mógłbym użyć do wyszukiwania (co wymagało EntityPersiter, który następnie zaprowadził mnie do klasy SessionImpl. Dla zainteresowanych dodałem rozwiązanie, którego użyłem do pytania . –

Powiązane problemy