2010-10-27 16 views
6

मैं हाइबरनेट में नया हूं। जब मैं विशिष्ट इकाई को सहेजता हूं तो यह मौजूदा डेटा से डेटा को फिर से लिखता है।HIbernate इकाई को जारी/सहेजते समय डेटा ओवरराइट करें

मैं आईडी का इस्तेमाल किया है के रूप में स्वत: नीचे के रूप में उत्पन्न: अगली बार तो यह

class StudDAO() { 

public static void main(String[] args){ 
    StudDAO obj = new StudDAO(); 
    Stud stud = new Stud(); 
    stud.setName("Test"); 
    stud.setCity("Mumbai"); 
    obj.createStud(stud); 
} 

public void createStud(Stud stud) { 
    try { 

    Session session = HibernateSessionFactory.getSessionFactory().openSession(); 
    Transaction transaction = session.beginTransaction(); 
    session.save(stud); 
    transaction.commit(); 

    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
     transaction.rollback(); 
    } 
} 

}

अगर मैं इकाई मूल्य बदल जाएगा:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="id") 
private int id; 

यहाँ मैं नीचे के रूप में इकाई को बचाने फॉर्म 1 आईडी शुरू करने के बजाय अगली आईडी उत्पन्न करनी चाहिए।

किसी भी समय परिणाम ही होगा की तरह सेट में

mysql> select * from stud; 

+----+--------+------+ 
| id | city | name | 
+----+--------+------+ 
| 1 | Mumbai | Test | 
+----+--------+------+ 

1 पंक्ति (0.00 सेकंड)

क्या मैं चाहता हूँ नीचे की तरह परिणाम में है:

mysql> select * from stud; 
+----+--------+------+ 
| id | city | name | 
+----+--------+------+ 
| 1 | Mumbai | Test | 
| 2 | Mumbai | Test | 
+----+--------+------+ 
2 rows in set (0.00 sec) 

कृपया मेरे लिए मदद वही ..

उत्तर

13

मुझे एहसास है कि यह एक साल पहले पूछा गया था, लेकिन मुझे वही समस्या थी जैसा आपने और मुझे लगा कि मैं इसे किसी और के मामले में पोस्ट करूंगा।

यह पता चला कि यह मेरे सत्र कारखाने में एक सेटिंग था: स्थापित करने hibernate.hbm2ddl.auto के लिए

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

यहां कुछ अलग-अलग मूल्य हैं जिन्हें आप यहां से चुन सकते हैं। विकास के लिए मेरा मानना ​​है कि आप इसे अपडेट करें क्योंकि यह आपके लिए नई टेबल बनाएगा यदि वे पहले से मौजूद नहीं हैं (बस बनाने की तरह), लेकिन यदि तालिका पहले से मौजूद है तो यह स्कीमा अपडेट करेगी।

उत्पादन के लिए आप चाहिएसत्यापित करें को छड़ी के रूप में यह आप स्कीमा, बस सत्यापित करें परिवर्तन नहीं करेगा यह :)

विभिन्न मूल्यों की अधिक जानकारी के लिए जाँच this excellent answer

+0

धन्यवाद। जिसने मदद की। –

+0

इसके लिए धन्यवाद! – dade

2

यदि आप प्रत्येक बार डेटाबेस में एक नई पंक्ति जोड़ने के बजाय अद्यतन करना चाहते हैं n आपको वांछित इकाई को पुनर्प्राप्त करने, किसी वांछित अपडेट करने की आवश्यकता है, और फिर इकाई को फिर से सहेजने की आवश्यकता है।

1

का उपयोग कर saveOrUpdate(..)

ध्यान दें कि जेपीए (हाइबरनेट) संस्थाओं उनके @Id से पहचाने जाते हैं की कोशिश। यदि आपकी ऑब्जेक्ट में डीबी में एक जैसी आईडी है, तो एक अपडेट होगा। अन्यथा, तार्किक रूप से, सम्मिलित होगा।

+0

उनके उदाहरण से, ऐसा लगता है कि वह एक कमांड लाइन उदाहरण चला रहा है और डेटाबेस में नई प्रविष्टियों को जोड़ने के लिए बाद के निष्पादन की अपेक्षा करता है। –

+0

हां यह सच है..लेकिन इसके लिए कोई और तरीका है? यदि मैं अलग-अलग इकाई मान डालता हूं तो यह नया रिकॉर्ड बनाने के बजाए मौजूदा डेटा से डेटा को फिर से लिखता है .. अगर मेरी तालिका का अधिकतम आईडी 2 है तो अगला डाला गया डेटा तीसरा होना चाहिए। लेकिन यह अभी से 1 से शुरू हुआ है। – Sweety

0

बनाई गई आपकी डेटाबेस तालिका में एक पंक्ति जोड़ने से

`id` INT(11) NOT NULL AUTO_INCREMENT 

AUTO_INCREMENT आईडी गिनती को बढ़ाता है और जब आप तालिका में पंक्ति जोड़ते हैं।

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