2009-07-16 10 views
35

जेपीए में, वहाँ किसी भी तरह से आप हाइबरनेट के saveOrUpdate behavior को दोहराने कर सकते हैं,आप जेपीए में हाइबरनेट के saveOrUpdate को दोहरा सकते हैं?

saveOrUpdate 

public void saveOrUpdate(Object object) 
        throws HibernateException 

    Either save(Object) or update(Object) the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking). 

    This operation cascades to associated instances if the association is mapped with cascade="save-update". 

    Parameters: 
     object - a transient or detached instance containing new or updated state 
    Throws: 
     HibernateException 
    See Also: 
     save(Object), update(Object) 

जो अनिवार्य रूप से या यदि वस्तु पहले से ही है कि या तो होने की जरूरत के रूप में वस्तु अद्यतन डेटाबेस में मौजूद है और यह देखने के लिए जाँच करता है का एक नया उदाहरण बचाता है वस्तु।

जेपीए ट्रांसकेशंसलेस पढ़ना अच्छा है, लेकिन मैं वास्तव में हाइबरनेट से इस विधि को याद कर रहा हूं। अनुभवी जेपीए डेवलपर्स इसे कैसे संभालें?

+0

"प्राथमिक कुंजी" शून्य है या नहीं, यह जांचने के बारे में क्या है? –

उत्तर

27

EntityManager.merge विधि का उपयोग करने का प्रयास करें - यह बहुत समान है।

Xebia के ब्लॉग पोस्ट में मतभेद का एक बहुत अच्छा वर्णन है: "। JPA Implementation Patterns: Saving (Detached) Entities"

+6

मेरे लिए यहां बड़ा लेना है "मौजूदा इकाई को अपडेट करते समय, हम किसी भी EntityManager विधि का आह्वान नहीं करते हैं; जेपीए प्रदाता स्वचालित रूप से डेटाबेस को फ्लैश या समय पर अपडेट कर देगा।" –

+1

लिंक मर चुका है। यहां नया है: http://blog.xebia.com/jpa-implementation-patterns- बचत-detached-entities/ – Dmitry

5

पाब्लोोजिम से जुड़े आलेख में उल्लिखित विधि के साथ समस्या यह है कि यह ऑटो जेनरेट की गई प्राथमिक कुंजी को बहुत अच्छी तरह से संभाल नहीं पाता है।

एक नई ओआरएम इकाई ऑब्जेक्ट के निर्माण पर विचार करें, तो आप डेटाबेस तालिका में मौजूदा पंक्ति के समान डेटा दे सकते हैं, लेकिन जब तक कि मैं गलत नहीं हूं, इकाई प्रबंधक उन्हें एक ही पंक्ति के रूप में नहीं पहचानता है जब तक उनके पास वही प्राथमिक कुंजी, जो एक ऐसी इकाई में है जो स्वत: जेनरेट की गई कुंजी का उपयोग करती है, तब तक आप डेटाबेस तक नहीं पहुंच सकते हैं।

यहां मेरी स्थिति के लिए वर्तमान कार्य है;

/** 
* Save an object into the database if it does not exist, else return 
* object that exists in the database. 
* 
* @param query query to find object in the database, should only return 
* one object. 
* @param entity Object to save or update. 
* @return Object in the database, whither it was prior or not. 
*/ 
private Object saveOrUpdate(Query query, Object entity) { 
    final int NO_RESULT = 0; 
    final int RESULT = 1; 

    //should return a list of ONE result, 
    // since the query should be finding unique objects 
    List results = query.getResultList(); 
    switch (results.size()) { 
     case NO_RESULT: 
      em.persist(entity); 
      return entity; 
     case RESULT: 
      return results.get(0); 
     default: 
      throw new NonUniqueResultException("Unexpected query results, " + 
        results.size()); 
    } 
} 
+1

विलय और सहेजेंऑरअपडेट सतही रूप से समान हैं, लेकिन समान नहीं है। अर्थशास्त्र में महत्वपूर्ण अंतर हैं। – skaffman

+0

@ स्काफमैन, क्या आपको लगता है कि मेरा दृष्टिकोण त्रुटिपूर्ण है? यदि आप कुछ रचनात्मक आलोचना मेरे रास्ते में फेंक सकते हैं। मैं इस जेपीए सामान के लिए जंगल में एक बेब हूँ। –

+0

बस यह पुराना धागा मिला, और मैं नए जावा ENUMS को छोड़कर इस समाधान की तरह कुछ कार्यान्वित कर रहा हूं। धन्यवाद। – oberger

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