2012-10-27 11 views
6

के साथ हाइबरनेट अपडेट मैं हाइबरनेट 4.1.7 का उपयोग कर रहा हूं और ऑब्जेक्ट को अपडेट करने का प्रयास कर रहा हूं, लेकिन कोई दस्तावेज नहीं है कि इसे कैसे किया जाना चाहिए। वर्तमान में, मैं यह कर रहा हूं:EntityManager

Person person = personDao.getPersonById(1); 
    person.setAge(23); 
    person.setLastname("McName"); 
    person = personDao.update(person); 

PersonDao अद्यतन में लगता है कि:

public Person update(Person person) { 
     return entityManager.merge(person); 
    } 

PersonDao getPersonById में है:

public Person getPersonById(int id) { 
     personQuery = entityManager.createNamedQuery("Person.findPerson", Person.class); 
     personQuery.setParameter("id", id); 
     return personQuery.getSingleResult(); 
    } 

इसके अलावा मेरे पास व्यक्ति वर्ग के अंदर परिभाषित नामित क्वेरी और है यहां:

@NamedQuery(name="Person.findPerson", query="SELECT p FROM Person p WHERE p.id = :id") 

इसका उपयोग करके मेरा व्यक्ति अपडेट नहीं किया जाएगा, मुझे हाइबरनेट का उपयोग करके अद्यतन कैसे कार्यान्वित करना चाहिए?

+0

उपरोक्त कोड ठीक है, सिवाय इसके कि 'personDao.update() करने के लिए कॉल' पूरी तरह से अनावश्यक है कि अगर सब कुछ एक एकल लेनदेन में चलाया जाता है: एक इकाई के राज्य स्वतः पर/हाइबरनेट जेपीए द्वारा लगातार किया जाता है लेनदेन का अंत। GetPersonById विधि को 'em.find (Person.class, id)' में भी घटाया जा सकता है, जो कि सरल और अधिक कुशल होगा, क्योंकि अगर इकाई पहले से लोड हो जाती है तो यह किसी भी क्वेरी को निष्पादित नहीं करेगा। –

+0

परिशिष्ट: यह निश्चित रूप से प्रलेखन में समझाया गया है। Http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e772 –

उत्तर

4

आपके लिए दो परिदृश्य पॉप अप हो सकते हैं।

आप ऑब्जेक्ट की एक संपत्ति, और केवल उस संपत्ति को बदलना चाहते हैं।

यदि ऐसा है तो आप विधि का उपयोग करना चाहते हैं: ढूंढें, संशोधित करें, फ्लश करें, प्रतिबद्ध करें।

em.find(Person.class, person.getId()) 
person.setStatus("ACTIVE"); 
em.commit();//implicitly flushes if flush mode is COMMIT or AUTO. 

आप आइटम को अपडेट करने के लिए ऑब्जेक्ट गुणों का उपयोग करना चाह सकते हैं।

यदि ऐसा है तो आप विधि का उपयोग करना चाहते हैं: मर्ज करें, वैकल्पिक रूप से संशोधित करें, फ्लश करें, प्रतिबद्ध करें।

em.merge(person); 
//modify person if you wish. 
em.commit();//implicitly flushes if flush mode is COMMIT or AUTO. 
+0

मेरा समाधान मिला, अंत में मैंने इकाई प्रबंधक.getTrasaction() शुरू किया(); व्यक्ति = entityManager.find (Person.class, id); entityManager.merge (व्यक्ति); // व्यक्ति डेटा संशोधित करें entityManager.getTransaction()। प्रतिबद्ध(); – Timo

+0

खुशी है कि आपको एक समाधान मिला। यदि खोज के दौरान उपयोग की जाने वाली आईडी (Person.class, id) व्यक्ति है। विलय (व्यक्ति) करते समय उपयोग किया जाता है, तो विलय आवश्यक नहीं हो सकता है। एक बार जब आप पाते हैं, तो आपकी इकाई प्रबंधित होती है और आप अपने परिवर्तनों को संशोधित और प्रतिबद्ध कर सकते हैं। – dseibert

0

मैं क्या आप वास्तव में पूछ रहे हैं पता नहीं है, लेकिन अपने विधि, Person.getPersonById(int id) में, आपको निम्न के साथ अपने कोड को आसान बनाने में कर सकते हैं:

return entityManager.find(Person.class, id); 
1

हाइबरनेट और भी अन्य जेपीए कार्यान्वयन स्वचालित रूप से संस्थाओं के राज्य का प्रबंधन और यदि लेनदेन में संशोधन संलग्न है तो इसे डेटाबेस में सहेजें। आपको merge या update विधियों को स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है।

EntityTransaction tx = entityManager.getTransaction(); 
tx.begin(); 
Person person = personDao.getPersonById(1); 
person.setAge(23); 
person.setLastname("McName"); 
tx.commit(); 

और अपने सभी संशोधनों स्वचालित रूप से डेटाबेस में सहेजा जाएगा:

आप संसाधन स्थानीय लेनदेन (JTA लेनदेन प्रबंधक नहीं) का उपयोग कर रहे हैं, तो कुछ इस तरह की कोशिश करो।

यदि आप जेटीए का उपयोग कर रहे हैं तो आपको लेनदेन सीमाओं को किसी अन्य तरीके से चिह्नित करना होगा, उदाहरण के लिए वसंत एओपी @Transactional एनोटेशन का उपयोग करके।

+0

मैं hsqldb (संसाधन-स्थानीय) का उपयोग कर रहा हूं और इस कोड का उपयोग करके मुझे अपवाद मिलता है: org.hibernate। PersistentObjectException: अलग इकाई को जारी रखने के लिए पारित किया गया: com.application.model.Person – Timo

+0

शायद आप EntityManager के दो विशिष्ट उदाहरणों का उपयोग कर रहे हैं। – Jarek

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