व्यवहार

उपलब्ध

4.1 हायबरनेटमधील व्यवहारांचा परिचय

वरील सर्वांमध्ये, मी व्यवहारांबद्दल माहिती जोडू इच्छितो. तुम्हाला आधीच माहित आहे की, व्यवहार हा क्रियांचा एक समूह आहे जो फक्त सर्वांनी मिळून केला पाहिजे . कोणतीही कृती अयशस्वी झाल्यास किंवा त्रुटीसह अंमलात आणल्यास, इतर सर्व क्रिया रद्द केल्या पाहिजेत.

हायबरनेट दोन प्रकारच्या व्यवहारांसह कार्य करण्यास सक्षम आहे:

  • जेडीबीसी
  • जेटीए

जेडीबीसी व्यवहार हा प्रत्यक्षात डेटाबेस व्यवहार असतो. हे डेटाबेससह काम करण्यासाठी, JDBC कनेक्शनशी जोडलेले आहे. आणि तो खात्री करतो की डेटाबेससह कार्य करताना क्रिया त्या केल्या पाहिजेत त्या केल्या जातात: एकतर सर्व किंवा काहीही नाही.

JTA - व्यवहार हा अनुप्रयोग स्तरावरील व्यवहार आहे. हे कोणत्याही डेटाबेसशी जोडलेले नाही. काही क्रिया केल्या गेल्या आहेत याची खात्री करणे हे त्याचे कार्य आहे: एकतर सर्व किंवा काहीही नाही.

उदाहरणार्थ, तुम्ही एकाच JTA व्यवहारामध्ये अनेक वेगवेगळ्या डेटाबेसेसमध्ये डेटा लिहू शकता. त्यानंतर जर एरर आली, तर जेटीए व्यवहाराला सर्व डेटाबेसमधील बदल मागे घ्यावे लागतील. अगदी विशिष्ट डेटाबेसच्या दृष्टीने यशस्वीरित्या अंमलात आणल्या गेलेल्या.

4.2 हायबरनेट व्यवहार इंटरफेस

हायबरनेट लायब्ररीमध्ये, व्यवहार इंटरफेसद्वारे दर्शविले जाते, ज्याची अंमलबजावणी भिन्न असू शकते. उदाहरणार्थ, स्प्रिंगसह काम करताना, स्प्रिंग स्वतःची JTA व्यवहार यंत्रणा प्रदान करते.

या इंटरफेसच्या पद्धती आहेत:

# पद्धत वर्णन
सुरू() नवीन व्यवहार सुरू करतो
2 वचनबद्ध() व्यवहार संपवतो, सर्व बदल पुश/कमिट करतो
3 रोलबॅक() वर्तमान व्यवहार परत आणतो
4 सेटटाइमआउट(इंट सेकंद) जास्तीत जास्त व्यवहार अंमलबजावणी वेळ सेट करते
isactive() व्यवहार सक्रिय आहे की नाही ते तपासते
6 रोलबॅक होते() व्यवहार सामान्यपणे परत आला का ते तपासते
वचनबद्ध होते() व्यवहार सामान्यपणे झाला आहे का ते तपासते
8 रजिस्टर सिंक्रोनाइझेशन() व्यवहार नियंत्रित करण्यासाठी कॉलबॅकची नोंदणी करते

महत्वाचे! व्यवहाराची वस्तू तयार करणे आणि व्यवहार सुरू करणे या दोन भिन्न गोष्टी आहेत. येथे तुम्ही थ्रेड वर्गाशी साधर्म्य काढू शकता. जेव्हा तुम्ही थ्रेड() ऑब्जेक्ट तयार करता, तेव्हा JVM अजून नवीन थ्रेड सुरू करत नाही. ते सुरू करण्यासाठी, तुम्हाला थ्रेड ऑब्जेक्टवर start() पद्धत कॉल करणे आवश्यक आहे. व्यवहाराबाबतही असेच आहे - त्यास begin() पद्धत कॉल करणे आवश्यक आहे.

सामान्यतः हायबरनेटमध्ये व्यवहार कसे हाताळले जातात याचे उदाहरण:

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
try {
    transaction.begin();
    Long count = session.createQuery("select count(*) from Employee", Long.class).uniqueResult();
    transaction.commit();
}
catch (Exception e) {
	if (transaction.getStatus() == ACTIVE || transaction.getStatus() == MARKED_ROLLBACK) {
    transaction.rollback();
    }
}
finally {
	session.close();
	sessionFactory.close();
}

आपण येथे तीन गोष्टी पाहतो:

प्रथम, डेटाबेससह सर्व कार्य कॉलिंग पद्धतींद्वारे व्यवहारात गुंडाळले जाते begin()आणि commit()या दोन पद्धतींवरील कॉल दरम्यान सर्व क्रिया केल्या पाहिजेत: एकतर सर्व एकत्र किंवा काहीही नाही.

दुसरे म्हणजे, कोणतीही त्रुटी आढळल्यास, आम्ही व्यवहार परत करण्याचा प्रयत्न करतो - वर कॉल करा rollback(). begin()याचा अर्थ असा की TransactionManger ने प्रथम आणि दरम्यानच्या सर्व क्रिया रेकॉर्ड केल्या पाहिजेत commit()आणि नंतर आम्ही कॉल केल्यास सर्वकाही परत केले पाहिजे rollback().

आणि तसे, हे तथ्य नाही की रोलबॅक पद्धत कॉल करताना कोणतीही त्रुटी होणार नाही. चुका नेहमी होतात. तुम्हाला फक्त हे सत्य स्वीकारण्याची आणि त्यासाठी तयार राहण्याची गरज आहे.

4.3 व्यवहार व्यवस्थापक

व्यवहार व्यवस्थापनाच्या दृष्टीकोनातून, हायबरनेट JDBC साठी फक्त एक हलके ऑब्जेक्ट रॅपर आहे. हायबरनेटमध्ये स्वतःच व्यवहार प्रक्रिया वैशिष्ट्ये नाहीत. हायबरनेट व्यवहार प्रत्यक्षात अंतर्निहित जेडीबीसी व्यवहारासाठी (किंवा जेटीए व्यवहार रॅपर) एक आवरण आहे. JDBCTtransaction डीफॉल्ट आहे. Hiberante सेटिंग्ज फाइलमधील उदाहरण:

hibernate.transaction.factory_class  org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.factory_class  org.hibernate.transaction.JDBCTransactionFactory

व्यवहार वापरून आमच्या कोडवर आणखी एक नजर टाकूया:

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the base
session.flush();
transaction.commit();
session.close();

आता JDBCT Transaction वर्ग कोड पाहू:

public class JDBCTransaction implements Transaction {

    public void begin() throws HibernateException {
    	...
    	if (toggleAutoCommit) jdbcContext.connection().setAutoCommit(false);
    	...
    }
}

व्यवहार सुरू करण्याची ही पद्धत आहे. नंतर पाठवण्याची पद्धत पहा:

public void commit() throws HibernateException {
    ...
    jdbcContext.connection().commit();
    ...
    jdbcContext.connection().setAutoCommit( true );
    ...
}

आता हा कोड हायबरनेट उदाहरण कोडमध्ये बदलूया:

हायबरनेट साधा JDBC कोड

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the database
session.flush();
transaction.commit();
session.close();

Connection conn = jdbcContext.connection();
conn.setAutoCommit(false);
 
//here is your database code
conn.commit ()
conn.setAutoCommit(true);
conn.close();

त्यामुळे मूळ हायबरनेट व्यवहार हे डेटाबेसला फक्त मूळ JDBC कॉल्स आहेत. काही जास्त नाही आणि काही कमी नाही. पण जेटीए व्यवहार अधिक मनोरंजक आहेत. पण त्याबद्दल आणखी एका वेळी.

टिप्पण्या
  • लोकप्रिय
  • नवीन
  • जुने
टिप्पणी करण्यासाठी तुम्ही साईन इन केलेले असणे आवश्यक आहे
या पानावर अजून कोणत्याही टिप्पण्या नाहीत