2013-07-06 9 views
8

हाइबरनेट docs शो इस उदाहरण:हाइबरनेट केवल पढ़ने के लिए लेन-देन

session = sessionFactory.openSession(); 
session.beginTransaction(); 
List result = session.createQuery("from Event").list(); 
for (Event event : (List<Event>) result) { 
    System.out.println("Event (" + event.getDate() + ") : " + 
     event.getTitle()); 
} 
session.getTransaction().commit(); 
session.close(); 

ऐसा क्यों है session.getTransaction().commit() प्रदर्शन करने के लिए भले ही घटना सूची केवल बाहर मुद्रित किया गया था आवश्यक है?

उत्तर

11

चयन को लेनदेन की भी आवश्यकता है। बिना लेनदेन के चयन को निष्पादित करना असंभव है। तथ्य यह है कि कुछ एसक्यूएल जीयूआई उपकरणों का उपयोग करते हुए डीबी से डेटा का चयन करते समय आपको लेनदेन को स्पष्ट रूप से शुरू और समाप्त करने की आवश्यकता नहीं है कि ये उपकरण autocommit मोड का उपयोग कर रहे हैं। ऑटोकॉमिट मोड में, डेटाबेस स्वचालित रूप से प्रत्येक एकल SQL कथन के लिए लेनदेन शुरू करेगा और प्रतिबद्ध करेगा जैसे कि आपको स्पष्ट रूप से लेनदेन सीमा घोषित करने की आवश्यकता नहीं है।

यदि आप एक लेनदेन (यानी प्रतिबद्ध या रोलबैक) समाप्त नहीं करते हैं, तो इस लेनदेन द्वारा उपयोग किए गए डेटाबेस कनेक्शन को जारी नहीं किया जाएगा और आपका डेटाबेस अंततः उपलब्ध कनेक्शन से बाहर हो जाएगा।

हाइबरनेट के लिए, यह डिफ़ॉल्ट रूप से गैर-ऑटोोकॉमिट मोड का उपयोग करता है (जिसे hibernate.connection.autocommit संपत्ति द्वारा निर्दिष्ट किया गया है)। तो हमें लेनदेन सीमा घोषित करनी होगी और सुनिश्चित करना होगा कि लेनदेन समाप्त हो गया है।

लेकिन अगर हाइबरनेट एपीआई का उपयोग कर आप केवल क्वेरी डेटा, तो यह और भी आप स्पष्ट रूप से क्योंकि निम्न के लेन-देन सीमा नहीं घोषित करते हैं ठीक है:

  1. डाटाबेस आम तौर पर अपने आप एक नई लेन-देन शुरू कर देंगे जब वर्तमान एसक्यूएल कथन के लिए एक की आवश्यकता होती है और पहले कोई लेनदेन स्पष्ट रूप से शुरू नहीं होता है।

  2. Session.close(), JDBC विनिर्देश के अंतर्निहित Connection .according close() जाएगा अगर java.sql.Connection#close() कहा जाता है और वहाँ एक सक्रिय लेन-देन है, यह सक्रिय लेन-देन का परिणाम JDBC विक्रेता के कार्यान्वयन पर निर्भर करता है। आमतौर पर, जेडीबीसी ड्राइवर स्वचालित रूप से इस लेनदेन को प्रतिबद्ध या रोलबैक करेगा। लेकिन इस मामले में, इससे कोई फर्क नहीं पड़ता कि लेनदेन करता है या रोलबैक करता है क्योंकि आप पहले से ही इच्छित डेटा प्राप्त कर चुके हैं।

+0

विस्तृत उत्तर के लिए धन्यवाद –

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