2011-02-23 16 views
5

कभी-कभी जब ओबीजी बना रहता है, तो इसके क्षेत्र में से एक डीबी क्षेत्र में फिट होने के लिए बहुत बड़ा होता है, जिसके परिणामस्वरूप डेटा छंटनी अपवाद होता है। निम्नलिखित कोड में, मैं डेटा अपवाद को पकड़ने का प्रयास करता हूं और बस फ़ील्ड को खाली करता हूं, और बचाता हूं। हालांकि मुझे सहेजते समय अपवाद मिलता है। बैच अपडेट अपवाद क्यों होता है और मैं इसके आसपास कैसे हो सकता हूं?org.hibernate.StaleStateException: बैच अपडेट अद्यतन से अप्रत्याशित पंक्ति गणना लौटा [0]; वास्तविक पंक्ति गणना: 0; अपेक्षित: 1

 

public static void save(Object obj) throws Exception{ 
     try{ 
      beginTransaction(); 
      getSession().save(obj); 
      commitTransaction(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
      rollbackTransaction(); 
      throw e; 
     }finally{ 
      closeSession(); //not needed, session obtained from sf.getCurrentSession() will auto close 
     } 
    } 
public static void saveXXX(XXX rec){ 

     try { 
      save(rec); 
     } catch (org.hibernate.exception.DataException e) { 
      e.printStackTrace(); 

      saveXXX(rec, e); //causes an exception  
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
    private static void saveXXX(WhoisRecord rec, DataException e) { 
     rec.setField(""); //empty out the problem field 
     saveXXX(rec); 

अपवाद:

 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85) 
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70) 
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114) 
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) 
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2382) 
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635) 
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
. 
. 
. 

उत्तर

2

मैं तुम्हें वास्तव में बताने के लिए पर्याप्त सुराग नहीं है। मैं बस इतना कह सकता हूं कि मेरे पास एक ही समस्या थी और सहेजने के बजाय विलय() को कॉल करके हल किया गया था()। अलग-अलग वस्तुओं के मामले में आपको हमेशा मर्ज() का उपयोग करना चाहिए।

3

मैं इस पर कोई विशेषज्ञ हूँ, लेकिन मुझे लगता है कि मैं सिर्फ एक ही समस्या थी लेकिन विपरीत दिशा में।

ऐसा लगता है कि क्या हो रहा है कि आप रिकॉर्ड को बचाने की कोशिश है, और हाइबरनेट कि डेटा काट-छांट अपवाद फेंकता है, जिसका अर्थ है कि यह कुछ बचा लिया लेकिन जैसे आप चाहते हैं की नहीं सभी तरह। तो आप उस अपवाद को पकड़ते हैं, और लेनदेन को वापस लाने की कोशिश करते हैं। लेकिन यह हमेशा सफल होने की गारंटी नहीं देता है (जो मैं Hibernate save() and transaction rollback पर देखता हूं), इसलिए सहेजा गया डेटा अभी भी वहां हो सकता है। आइए मान लें कि यह है। इसके बाद आप अपना रिकॉर्ड बदल दें, और इसे फिर से सहेजने का प्रयास करें।

लेकिन चूंकि डेटा अभी भी वहाँ है, को बचाने के कुछ नहीं करेंगे बुला उस मामले में के रूप में यह एक अद्यतन किया जाना चाहिए। तो जब आप उस लेनदेन को करने का प्रयास करते हैं, तो हाइबरनेट जानता है कि आप 1 रिकॉर्ड को सहेजना चाहते हैं लेकिन यह 0 को बचाने में सफल होता है, इसलिए त्रुटि।

getSession() बदलने का प्रयास करें बचाने (obj)। से getSession()। SaveOrUpdate (obj);। जब यह अस्तित्व में नहीं होता है तो रिकॉर्ड को सहेजना चाहिए और इसे अद्यतन करना (ओवरलैज फ़ील्ड नहीं होना) जब यह करता है।

3

मैं क्योंकि मैं वर्ग मानचित्रण में महत्वपूर्ण के गलत जनरेटर था यह त्रुटि आई, और उसके बाद मैं एक ही लेन-देन में पहली बार एक डालने किया था और बाद में एक अद्यतन।

कुंजी स्तंभ (MySQL में) autoincrement रूप में परिभाषित किया गया था, और इस मानचित्रण

<id name="tableId" type="long" access="field"> 
    <column name="tableId" /> 
    <generator class="assigned" /> 
</id> 

साथ मैं एक StaleStateException मिला, लेकिन जब मैं

<id name="tableId" type="long" access="field"> 
    <column name="tableId" /> 
    <generator class="native" /> 
</id> 

के लिए प्रवेश को सही तो यह अच्छी तरह से काम बिना किसी समस्या के।

+0

आप सबसे अच्छा कर रहे हैं, आप मेरा दिन बचाया – BSeitkazin

1

यह आपकी मैपिंग फ़ाइल से आता है। ओरेकल में अनुक्रम के लिए मूल जनरेटर वर्ग मानचित्र। या तो अनुक्रम बनाएं (आधार नाम जिसे वह उपयोग नहीं करता है, लेकिन मुझे लगता है कि यह हाइबरनेट दस्तावेज़ों में है) या किसी अन्य जनरेटर पर स्विच करें।

मैं सौंपा के मूल निवासी से बदलने के लिए, और अब यह किसी भी अपवाद नहीं मिलता है लेकिन, वस्तु डेटा बेस में कायम नहीं कर रहा है।

http://forum.spring.io/forum/spring-projects/data/19856-not-saving-in-an-oracle-data-base

1

मैं क्या अनुभव किया है कि इस अपवाद उठाने जब वस्तु को अपडेट करने में आईडी जो तालिका में मौजूद नहीं है। यह कहता है कि अगर तुम अपवाद संदेश पढ़ा "बैच अद्यतन अद्यतन से अप्रत्याशित पंक्ति संख्या लौटे [0]; वास्तविक पंक्ति गणना: 0; की उम्मीद: 1" का अर्थ है कि उसमें आपके दिए गए आईडी के साथ रिकॉर्ड नहीं मिला पा रहा था।

इससे बचने के लिए अगर मैं रिकॉर्ड नहीं मिला वापस तो मैं अद्यतन फोन अन्यथा फेंक "अपवाद रिकॉर्ड नहीं मिला" मैं हमेशा एक ही आईडी के साथ रिकॉर्ड पढ़ें।

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