2013-01-31 8 views
9

लेनदेन.com() क्या करता है?हाइबरनेट में banking.commit() क्या है?

Account account = new Account(); 
account.setId(100); 
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("Before Transaction: Balance = " + account.getBalance()); 
double preBal = account.getBalance(); 
account.setBalance(50000000); 
Transaction transaction = session.beginTransaction(); 
session.update(account); 
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("After Transaction: Balance = " + account.getBalance()); 
// transaction.commit();  
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("Pev-Bal=" + preBal + " Curr-Bal=" + account.getBalance()); 

यह मैं परिणाम देता है:

Hibernate: select account0_.id as id0_1_, account0_.balance as .......... 
Before Transaction: Balance = 300.0 
After Transaction: Balance = 5.0E7 
Pev-Bal=300.0 Curr-Bal=5.0E7 

लेकिन चूंकि मैं transaction.commit फोन नहीं किया() वहाँ डाटाबेस में कोई बदलाव नहीं किया गया था।

क्या इसका मतलब यह है कि सब कुछ केवल कुछ उदाहरण/ऑब्जेक्ट्स पर ही डेटाबेस को बदल दिए बिना किया गया था?

मैं हाइबरनेट के लिए नया हूं, इसलिए कृपया मुझे समझने में सहायता करें। मैं हाइबरनेट उपयोग कर रहा हूँ 4.

अद्यतन:

अगर मैं transaction.commit फोन() तो परिणाम इस लाइन

Hibernate: update account set balance=? where id=? 

और डाटाबेस को भी अद्यतन किया है।

क्या इसका मतलब यह है कि लेनदेन.com() पर कॉल किए बिना सबकुछ केवल डेटाबेस स्तर को बदले बिना उदाहरण स्तर पर किया गया था?

उत्तर

14

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

जब आपके पास लगातार ऑब्जेक्ट होता है और आप उस पर मान बदलते हैं, तो यह आपकी दृढ़ता परत में परिवर्तनों को फ्लश करने के लिए गंदे और हाइबरनेट की आवश्यकता बन जाती है। यह आप के लिए स्वचालित रूप से ऐसा कर सकते हैं या आपको लगता है कि आपके फ्लश मोड (ऑटो या मैनुअल) :)

संक्षेप में

तो पर निर्भर करता है इस मैन्युअल रूप से करने के लिए आवश्यकता हो सकती है,: transaction.commit() सत्र फ्लश करता है , लेकिन यह काम की इकाई भी समाप्त होता है।

है आपकी समस्या का एक समान संदर्भ here

1

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

मैं उस उपरोक्त उद्धरण को @pasacal द्वारा जोड़ रहा हूं: और यह डीबी प्रभावी नहीं होगा जब तक कि आप लेनदेन नहीं करते।

अधिक संदर्भ के लिए How expensive is committing a hibernate transaction?

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