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
istClassMetadata 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);
}
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 . –