2017-07-05 6 views
7

डेटाबेस में रिकॉर्ड करने के लिए मैं इस इकाई का उपयोग करता हूं।बैच अपडेट अद्यतन से अप्रत्याशित पंक्ति गणना लौटा [0];

@Entity 
@Table(name = "SYSTEM_USERS") 
public class SystemUsersModel implements Serializable 
{ 
    private static final long serialVersionUID = 8432414340180447723L; 

    @Id 
    @GeneratedValue 
    private Integer id; 

    @Column 
    private String username; 

    @Column 
    private String email; 

    @Column 
    @Type(type = "date") 
    @Temporal(TemporalType.DATE) 
    private Date lastlogin; 

    @Column 
    private String password; 

    @Column 
    private String salt; 

    @Column 
    @Type(type = "date") 
    @Temporal(TemporalType.DATE) 
    private Date added; 

हटाएँ क्वेरी:

Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

मैं स्क्रिप्ट का उपयोग कर कई पंक्तियों डाला था इससे पहले कि मैं आवेदन शुरू:

SessionFactory factory = HibernateUtils.getSessionFactory(); 
     Session session = factory.getCurrentSession(); 

     try 
     { 
      session.getTransaction().begin(); 

      SystemUsersModel obj = new SystemUsersModel(); 
      obj.setId(userlist.getId()); 

      session.delete(obj); 

      session.getTransaction().commit(); 

      blacklists.remove(selectedBlackListEntry); 
      selectedBlackListEntry = null; 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
     } 

तब मैं कोड मैं इस त्रुटि मिलती है चलाते हैं। मैं इस मुद्दे को कैसे हल कर सकता हूं?

+0

हाइबरनेट इतना जब आप आईडी निर्धारित करते हैं, आप यह सुनिश्चित करें कि वस्तु निर्दिष्ट आईडी वाला DB में है पसंद नहीं है के लिए इस पृष्ठ पर जाएँ? आईडी द्वारा ऑब्जेक्ट को देखने का प्रयास करें और फिर आपको –

+0

की आवश्यकता को संशोधित करें जब आप अपवाद के बारे में पूछें, हमेशा अपवाद के पूर्ण स्टैक ट्रेस को पोस्ट करें। उस ने कहा, समस्या शायद सबसे अधिक है कि आप एक पंक्ति को हटा रहे हैं जो अस्तित्व में नहीं है। –

+0

यहां पूर्ण स्टैक ट्रेस है https://pastebin.com/sFGMNGim –

उत्तर

9

जब आप हाइबरनेट के साथ ऑब्जेक्ट्स के उदाहरण प्रबंधित करते हैं, तो उन्हें सत्र में "संलग्न" होना होता है।

यदि आप new के साथ कोई ऑब्जेक्ट बनाते हैं तो आपको इसे हाइबरनेट के साथ प्रबंधित करने से पहले इसे सत्र में संलग्न करने की आवश्यकता है।

जब कोई ऑब्जेक्ट (जेनरेट आईडी के साथ) में आईडी मान होता है, तो हाइबरनेट उम्मीद करता है कि वह ऑब्जेक्ट उसके सत्र में मौजूद है (क्योंकि आईडी मान केवल तभी अस्तित्व में हो सकता है जब हाइबरनेट ने इसे उत्पन्न किया हो या हाइबरनेट ने इसे क्वेरी के माध्यम से डेटाबेस से लाया हो), अन्यथा यह स्टाइल अपवाद फेंकता है।

आप या तो हाइबरनेट के लिए उस पर saveOrUpdate कॉल करने के लिए अपने आईडी बनाने के लिए और (मामले में यह databse में मौजूद नहीं है) सत्र के लिए उदाहरण देते हैं, या आईडी के साथ load फोन हाइबरनेट उदाहरण लाने के लिए है डेटाबेस से (यदि यह डेटाबेस में मौजूद है)।

इस मामले में आप आईडी को जानते हैं, इसलिए आपको संलग्न उदाहरण प्राप्त करने के लिए हाइबरनेट से पूछना होगा। तो, ऐसा करें:

SystemUsersModel obj = session.load(SystemUsersModel.class, userlist.getId()); 
session.delete(obj); 

यहाँ हाइबरनेट सत्र का एक उदाहरण सम्मान के विभिन्न राज्यों का विवरण है: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html

संपादित: धन्यवाद

या बेहतर @vanoekel को, load के बजाय आप केवल getReference का उपयोग कर सकते हैं क्योंकि यह संसाधनों के मामले में कम महंगा होगा, अगर आप इसे बाद में हटाना चाहते हैं।

+0

पूरी इकाई को हटाने के बजाय इसे हटाने के बजाय, आप एक संदर्भ भी बना सकते हैं, https://stackoverflow.com/a/40468433/3080094 – vanOekel

+0

अच्छा बिंदु देखें।उत्तर संपादित और स्वीकृत। धन्यवाद। – gmanjon

+0

@GhostCat भी ध्यान नहीं दिया, वैसे भी वोट दें करने के लिए धन्यवाद :) तो कोई चिंता नहीं: डी – gmanjon

0

अपवाद अपने वस्तु प्राथमिक कुंजी जो स्वचालित रूप से जेनरेट और आप सौंपा कुंजी करने के लिए मजबूर कर रहे हैं अपवाद का कारण हो सकता है, तो नीचे लाइन के लिए

हो रहा हो सकता है कर रहा है।

कृपया विस्तार से व्याख्या HERE

+0

पर प्रलेखित है होना चाहिए चाहते हैं मैं यह कहना चाहता हूं कि यह बेहद असंभव है। परिणामस्वरूप ऑब्जेक्ट का उपयोग केवल अंतर्निहित डेटाबेस रिकॉर्ड को हटाने का अनुरोध करने के लिए किया जाता है। जिस मामले का आप वर्णन कर रहे हैं वह तब होता है जब आप रिकॉर्ड को अपडेट या डालना चाहते हैं। –

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