2014-05-06 12 views
5

Ich möchte effizient mehrere Entitäten aus der DB laden, während Sie den Hibernates-Session-Cache nutzen (1st level cache nicht 2nd level). Ich habe versucht, so etwas wie die folgenden Funktionen ausführen:Wie kann ich feststellen, ob eine Entität im Hibernate-Sitzungscache mit einer Entitäts-ID bereits existiert?

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

Das Problem mit der oben ist, dass containsEntity nicht in der Session-Klasse vorhanden ist. Wenn ich es im Debugger anschaue, sehe ich die Informationen innerhalb der Klasse (in der persistentContext-Klasse), ich kann nur sehen, wie ich darauf komme.

- Update: Hier ist die Lösung war ich nach dem Lesen der Antwort verwendet wird, nicht sicher, ob es eine bessere oder nicht

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

Antwort

2

Sie Session.getStatistics() verwenden können, und dann EntityKey s Satz von SessionStatistics.getEntityKeys() genommen analysieren .

+1

Danke. Dies führte mich zu einer anderen Lösung, da ich auch einen EntityKey erstellen musste, den ich für die Suche verwenden konnte (was einen EntityPersiter erforderte, der mich dann zur SessionImpl-Klasse führte. Für Interessierte habe ich die Lösung hinzugefügt, die ich für die Frage verwendet habe . –

Verwandte Themen