2012-01-23 14 views
10

डेटाबेस के साथ काम करने के लिए, मेरी कक्षा HibernateDaoSupport कक्षा और विधियों के अंदर मैं वसंत HibernateTemplate का उपयोग कर रहा हूं।वसंत HibernateTemplate का उपयोग कर। आईडी द्वारा कैसे हटाएं?

तो, के लिए डेटाबेस में एक पंक्ति को हटा मैं इस विधि का उपयोग:

public void delete(MyObject obj) { 
    getHibernateTemplate().delete(obj); 
} 

सब ठीक है!

लेकिन, इस समय मैं एक विधि है कि आईडी के आधार पर एक पंक्ति को हटा सकते हैं लागू करने के लिए कोशिश कर रहा हूँ:
getHibernateTemplate().remove(id)

:

public void delete(final long id) { 
    // some code here 
} 

और मैं कुछ HibernateTemplate विधि इस तरह नहीं मिल सकता है

इस मामले में मेरे लिए एक अच्छा समाधान क्या है?

उत्तर

28

विशेष आईडी का उपयोग कर हटाने के लिए,

public void delete(long id) 
{ 
    Session session ; 
    MyObject myObject ; 

    session = sessionFactory.getCurrentSession(); 
    myObject = (MyObject)session.load(MyObject.class,id); 
    session.delete(myObject); 

    //This makes the pending delete to be done 
    session.flush() ; 

} 

इसके अलावा ट्राई/कैच में यह तरीकों encapuslate/अंत में और त्रुटि लॉग इन करने की जरूरत

+1

यह सबसे सुरुचिपूर्ण समाधान (एसक्यूएल/एचक्यूएल प्रश्नों का उपयोग किए बिना) प्रतीत होता है, लेकिन यह अक्षमता प्रतीत होता है क्योंकि यह पूरे ऑब्जेक्ट को इसे हटाने के लिए fecth प्रतीत होता है। क्या यह मामला है? यदि हां, तो क्या किया जा सकता है? –

+0

यदि आईडी मौजूद नहीं है, तो 'myObject' शून्य हो जाएगा, और' हटाएं() 'त्रुटि हो सकती है? – NingLee

+0

@NingLee हां, लोड के कारण आपको अपवाद मिलता है कि ऑब्जेक्ट मौजूद है। यदि आप इस तरह के अपवाद से बचना चाहते हैं तो 'लोड' –

7

आप उल्लेख किया है पर विचार, वहाँ HibernateTemplate में इस तरह के विधि नहीं है। तुम्हें पता है, निम्नलिखित कर सकते हैं

hibernateTemplate.delete(hibernateTemplate.get(Class,Id)); 
+0

वाह के बजाय' get' का उपयोग करें, यह कैस्केड को भी हटा देता है !! – Jess

6

तुम भी विधि नीचे का उपयोग कर सकते हैं:

public void deleteById(Class clazz,Integer id) { 
    hibernateTemplate.bulkUpdate("delete from "+clazz.getName()+" where id="+id); 
} 
8

एक अन्य विकल्प है:

public void deleteById(Class clazz,Integer id) { 
    String hql = "delete " + clazz.getName() + " where id = :id"; 
    Query q = session.createQuery(hql).setParameter("id", id); 
    q.executeUpdate(); 
} 
1

वहाँ एक वस्तु बनाने और केवल स्थापना करके एक सरल उपाय है आईडी:

Product product = new Product(); 
product.setId(37); 
session.delete(product); 

इस सरल समाधान की कमी यह है कि यह संबंधित उदाहरणों को हटा नहीं देता है।
यदि आपके पास उत्पाद की कुछ विशेषता (अन्य इकाई संबंधित) हटा दी गई है, तो आपको पहले उत्पाद लोड करना होगा।

Serializable id = new Long(17); 
Object persistentInstance = session.load(Product.class, id); 
if (persistentInstance != null) 
{ 
    session.delete(persistentInstance); 
} 

यह जारी होगा (अगर आपके पास कैस्केड में एक विशेषता तालिका है) तो बच्चों के गुणों पर एक हटा दें।

संबंधित मुद्दे