2008-10-21 16 views
23

मान लीजिए, प्रकार की वस्तुएं डीबी में संग्रहीत हैं।हाइबरनेट: जांचें कि ऑब्जेक्ट मौजूद है

org.hibernate.Session session = ...; 
long id = 1; 
A obj = session.load(A.class, id); 

आईडी = 1 के साथ वस्तु मौजूद नहीं है मैं ObjectNotFoundException मिल जाएगा: यहाँ जिस तरह से मैं डीबी से विशिष्ट एक हाइबरनेट का उपयोग करके लोड है। लेकिन क्या यह जांचने का कोई तरीका है कि अपवाद को पकड़ने के बिना ऐसी वस्तु मौजूद है या नहीं?

org.hibernate.Session session = ...; 
long id = 1; 
boolean exists = session.exists(A.class, id); 
if(exists){ 
// do smth..... 
} 

यह डॉक्स हाइबरनेट नहीं मिल सका ...

उत्तर

24

आप उपयोग कर सकते हैं session.get:

public Object get(Class clazz, 
        Serializable id) 
      throws HibernateException 

यह वस्तु अगर शून्य वापस आ जाएगी क्या मैं करना चाहते हैं ख़ाली की तरह है डेटाबेस में मौजूद नहीं है। आप Hibernate API Documentation में अधिक जानकारी प्राप्त कर सकते हैं।

+0

उत्पादन कर सकते हैं के साथ इस्तेमाल किया जा सकता हम्म ... मैं अभी भी एक ही बात (ObjectNotFoundException) कोई बात नहीं मैं चाहे मिल "लोड" या "प्राप्त करें" का प्रयोग करें। –

+0

शायद आपको पिछले सत्र से एक अपवाद मिल रहा है .load()? ऑब्जेक्ट नॉटफाउंड अपवाद के लिए दस्तावेज़ों से: "यह अपवाद तब नहीं फेंक दिया जा सकता है जब लोड() को कॉल किया जाता है क्योंकि लोड() संभव होने पर प्रॉक्सी लौटाता है। डीबी में कोई पंक्ति मौजूद है या नहीं, यह जांचने के लिए सत्र.get() का उपयोग करें।" – Juanma

+2

काम करता है लेकिन यह धीमा दृष्टिकोण है क्योंकि हाइबरनेट को सभी कॉलम लाने होंगे और उन्हें नए ऑब्जेक्ट पर प्रभावित करना होगा और सत्र में इसे स्टोर करना होगा। यदि आप संसाधनों को बेकार तरीके से बर्बाद नहीं करना चाहते हैं, तो इसके बजाय एचक्यूएल दृष्टिकोण पर विचार करें। –

42

आप वस्तु अस्तित्व की जाँच के लिए HQL उपयोग कर सकते हैं:

public Boolean exists (DTOAny instance) { 
    Query query = getSession().    
    createQuery("select 1 from DTOAny t where t.key = :key"); 
     query.setString("key", instance.getKey()); 
    return (query.uniqueResult() != null); 
} 

hibernatesuniqueResult() विधि अशक्त लौटाता है यदि कोई डेटा नहीं मिला था। एचक्यूएल का उपयोग करके आप अधिक जटिल क्वेरी मानदंड बना सकते हैं।

10

हाइबरनेट

को हासिल करेगा अनुकूलतम प्रदर्शन के लिए केवल कुंजी:

public boolean exists(Class clazz, String idKey, Object idValue) { 
    return getSession().createCriteria(clazz) 
      .add(Restrictions.eq(idKey, idValue)) 
      .setProjection(Projections.property(idKey)) 
      .uniqueResult() != null; 
} 

जेपीए

के बाद से हाइबरनेट जेपीए के एक कार्यान्वयन है, यह inject एक EntityManager करना संभव है। @Journeycorner

विधि नीचे
public boolean exists(Class<?> clazz, Object idValue) { 
    return getSession().createCriteria(clazz) 
      .add(Restrictions.idEq(idValue)) 
      .setProjection(Projections.id()) 
      .uniqueResult() != null; 
} 

एक की

public boolean exists(Class clazz, Object key) { 
    try { 
     return entitymanager.getReference(Entity.class, key) != null; 
    } catch (EntityNotFoundException.class) { 
     return false; 
    } 
} 
+2

आपको अंतिम पंक्ति के लिए सशर्त की आवश्यकता नहीं है: आप .uniqueResult()! = Null का उपयोग कर सकते हैं; संकेत के लिए – stephenwebber

+1

Thx, मैंने कोड अपडेट किया! – Journeycorner

3

थोड़ा सरलीकृत विधि भी उपयोगी हो सकता है: क्योंकि यह lazily fetches उदाहरण इस विधि भी अच्छा प्रदर्शन किया है। ध्यान रखें, कि इस विधि केवल मानदंड है कि नहीं एक से अधिक रिकॉर्ड (जैसे Restrictions.idEq() मापदंड)

public static boolean uniqueExists(Criteria uniqueCriteria) { 
    uniqueCriteria.setProjection(Projections.id()); 
    return uniqueCriteria.uniqueResult() != null; 
} 
संबंधित मुद्दे