在给定实体ID的情况下,如何确定实体是否已存在于Hibernate会话缓存中?

Ken*_*ner 5 hibernate

我希望从数据库中有效地加载多个实体,同时利用休眠会话缓存(第一级缓存而不是第二级).我试图做类似以下的事情:

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;
}
Run Code Online (Sandbox Code Playgroud)

上面的问题是sessionEntity在session类中不存在.当我在调试器中查看它时,我看到了类中的信息(在persistentContext类中),我只能看到如何获取它.

- 更新:这是我在阅读答案后使用的解决方案,不确定是否有更好的解决方案

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);
}
Run Code Online (Sandbox Code Playgroud)