我希望从数据库中有效地加载多个实体,同时利用休眠会话缓存(第一级缓存而不是第二级).我试图做类似以下的事情:
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)
| 归档时间: |
|
| 查看次数: |
1584 次 |
| 最近记录: |