2012-07-31 13 views
5

हाइबरनेट इकाई जो मैं डेटाबेस (ओरेकल) में सहेज रहा हूं, बहुत जटिल संबंध हैं, इस अर्थ में कि इसमें कई संबंधित संस्थाएं हैं। यह कुछ इस तरह दिखता ...जटिल संबंधों के साथ इकाई को सहेजते समय StaleStateException

@Table(name = "t_HOP_CommonContract") 
public class Contract { 
    @Id 
    private ContractPK id; 

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    private ContractGroupMember contractGroupMember; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumns({ 
     @JoinColumn(name = "TransactionId", referencedColumnName = "TransactionId"), 
     @JoinColumn(name = "PrimaryContractId", referencedColumnName = "PrimaryContractId") 
    }) 
    @Fetch(FetchMode.SUBSELECT) 
    private List<ContractLink> contractLinks; 

    // . . . . . . . 

    // A couple of more one to many relationships 

    // Entity getters etc. 

} 

मैं भी इस तरह के रूप में और अधिक संस्थाओं की एक जोड़ी है ...

@Table(name = "t_HOP_TRS") 
public class TotalReturnSwap { 
    @Id 
    private ContractPK id; 
    // Entity Getters etc. 
} 

चाल मैं में Contract और TotalReturnSwap संस्थाओं के हठ करना है वह यह है कि वही लेनदेन

कभी-कभी यह उन इकाइयों का समूह हो सकता है जिन्हें एक ही लेनदेन में जारी रखा जाना चाहिए।

मैंने TotalReturnSwap इकाई को सहेजने पर निम्नलिखित अपवाद को देखा है (जो Contract इकाई को सहेजने के बाद हमेशा किया जाता है)।

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is 
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:675) \ 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147) 
    at com.rbs.fcg.publishing.DownstreamContractBusinessEventPostingService.performTDWPersistenceForContracts(DownstreamContractBusinessEventPostingService.java:102) 
    at com.rbs.fcg.publishing.DownstreamContractBusinessEventPostingService.persistContractBusinessEvent(DownstreamContractBusinessEventPostingService.java:87) 
    at com.rbs.fcg.publishing.DownstreamContractBusinessEventPostingService.publish(DownstreamContractBusinessEventPostingService.java:67) 
    at com.rbs.fcg.publishing.PublishingProcessor.publish(PublishingProcessor.java:76) 
    at com.rbs.fcg.publishing.PublishingProcessor.process(PublishingProcessor.java:52) 
    at com.rbs.are.MultiThreadedQueueItemProcessor$2.run(MultiThreadedQueueItemProcessor.java:106) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: 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) 

अब कुछ बिंदुओं कि सवालों का जवाब है, जबकि मदद मिल सकती है:

  • मैं केवल बचत कर रहा हूँ (डालने) डेटाबेस में संस्थाओं - कभी नहीं अद्यतन करने/हटाने/पढ़ने
  • मैं अलग करने के लिए सक्षम किया गया है यह अपवाद भी एकल थ्रेडेड वातावरण में है, इसलिए यह एक बहु-थ्रेडिंग की तरह नहीं दिखता है, भले ही हमारा एप्लिकेशन बहु-थ्रेडेड

उत्तर

17

त्रुटि के कारण हो सकता है सदाबहार चीजें:

  1. ऑब्जेक्ट करने से पहले डेटा को फ़्लश करने से सभी ऑब्जेक्ट लंबित रहने के लिए लंबित हो सकते हैं।
  2. यदि ऑब्जेक्ट में प्राथमिक कुंजी है जो स्वतः उत्पन्न होती है और आप किसी असाइन की गई कुंजी
  3. को मजबूर कर रहे हैं यदि आप ऑब्जेक्ट को डेटाबेस पर करने से पहले ऑब्जेक्ट को साफ़ कर रहे हैं।
  4. शून्य या गलत आईडी: यदि आप आईडी को शून्य या कुछ और सेट करते हैं, तो हाइबरनेट डालने के बजाय अपडेट करने का प्रयास करेगा।
  5. ऑब्जेक्ट स्टेल है: सत्र से हाइबरनेट कैश ऑब्जेक्ट्स। यदि वस्तु संशोधित किया गया था, और हाइबरनेट इसके बारे में पता नहीं है, यह इस अपवाद फेंक देंगे - StaleStateException

ध्यान दें मैं इसके लिए क्रेडिट नहीं ले रहा हूँ, यह here पाया।

+0

बारे में # 5, हम इसे कैसे हल कर सकते हैं से objectA के एक ताजा सहायता को पुनः प्राप्त है? – Stony

+0

@ सोंटी शायद एक 'ताज़ा करें() '? – Michael

+0

@ माइकल मेरी समस्या 2 धागे एक ही पीओ को एक ही समय में संशोधित करती हैं; इसलिए जब पीओ को # 5 कारण के रूप में सहेजें, अपवाद फेंक दें। तो जब ताज़ा करें() मामले में? यदि सहेजने से पहले(), पीओ के लिए परिवर्तन अभी खत्म हो जाएगा। अंत में, मैंने अपनी समस्या को हल करने के लिए लॉक LockMode.PESSIMISTIC_WRITE लॉक का उपयोग किया। किसी के पास बेहतर समाधान है? – Stony

0

यह निम्न परिस्थितियों में मुझे क्या हुआ:

  • मैं जावा कोड में objectA बनाया।
  • मैंने एक वस्तु के रूप में objectA को मौजूदा ऑब्जेक्ट जोड़ा। ऑब्जेक्ट बी में ऑब्जेक्ट ए के साथ एक संबंध है।
  • मैंने डेटाबेस में सहेजा (बनाया) ऑब्जेक्ट ए।
  • जब ऑब्जेक्ट सहेजा गया था, ऑब्जेक्टबी को ऑब्जेक्ट ए की आईडी जोड़ने के लिए डेटाबेस में अद्यतन किया गया था।

  • तो मैं एक objectC objectA (एक objectA कई objectCs के लिए) जोड़ा गया। मैंने ऑब्जेक्ट ए को अपडेट करने का प्रयास किया और स्टैलेस्टेटेसेप्शन प्राप्त किया .... मर्ज का उपयोग करते समय भी।

जवाब है कि मैं या तो अद्यतन objectB करने के लिए आवश्यक या डेटाबेस

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