हाइबरनेट सत्र कैश का लाभ लेने के दौरान मैं डीबी से कई इकाइयों को कुशलतापूर्वक लोड करना चाहता हूं (प्रथम स्तर कैश द्वितीय स्तर नहीं)। मैं निम्नलिखित की तरह कुछ करने के लिए कोशिश कर रहा था:मैं कैसे निर्धारित कर सकता हूं कि एक इकाई पहले से मौजूद हाइबरनेट सत्र कैश में मौजूद है या नहीं?
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;
}
समस्या से ऊपर के साथ है कि containsEntity सत्र कक्षा में मौजूद नहीं है। जब मैं इसे डीबगर में देखता हूं, तो मुझे कक्षा के भीतर की जानकारी (लगातार कॉन्टेक्स्ट क्लास में) दिखाई देती है, मैं बस देख सकता हूं कि इसे कैसे प्राप्त किया जाए।
- अद्यतन: यहाँ समाधान मैं इस सवाल का जवाब पढ़ने के बाद इस्तेमाल किया था, यकीन नहीं अगर वहाँ एक बेहतर एक या नहीं
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);
}
धन्यवाद। इससे मुझे एक और समाधान मिल गया क्योंकि मुझे एक एंटिटीकी बनाने की भी आवश्यकता थी जिसे मैं खोज के लिए उपयोग कर सकता था (जिसके लिए एक एंटीटीपर्सिटर की आवश्यकता थी, जिसके बाद मुझे सत्र इंपल क्लास में ले जाया गया। उन लोगों के लिए, मैंने उस समाधान को जोड़ा है जिसका मैंने सवाल उठाया । –