हाइबरनेट - इंटरसेप्टर

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

इस प्रकार एक वस्तु अपने जीवन चक्र में विभिन्न चरणों से गुजरती है और Interceptor Interfaceकुछ आवश्यक कार्य करने के लिए विभिन्न चरणों में विभिन्न तरीकों से कॉल किया जा सकता है। ये विधियां सत्र से आवेदन तक की कॉलबैक हैं, जिससे एप्लिकेशन को सहेजे जाने, अद्यतन, हटाए जाने या लोड होने से पहले किसी स्थायी ऑब्जेक्ट की संपत्तियों का निरीक्षण करने और / या हेरफेर करने की अनुमति मिलती है। इंटरसेप्टर इंटरफ़ेस के भीतर उपलब्ध सभी तरीकों की सूची निम्नलिखित है -

अनु क्रमांक। विधि और विवरण
1

findDirty()

इस विधि को कहा जाता है जब flush() विधि एक सत्र वस्तु पर कहा जाता है।

2

instantiate()

यह विधि उस समय कहलाती है, जब एक दृढ़ वर्ग को त्वरित किया जाता है।

3

isUnsaved()

जब किसी ऑब्जेक्ट को पास किया जाता है तो इस विधि को कहा जाता है saveOrUpdate() तरीका/

4

onDelete()

किसी ऑब्जेक्ट को हटाने से पहले इस विधि को कहा जाता है।

5

onFlushDirty()

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

6

onLoad()

किसी ऑब्जेक्ट को इनिशियलाइज़ करने से पहले इस विधि को कहा जाता है।

7

onSave()

किसी वस्तु को सहेजने से पहले इस विधि को कहा जाता है।

8

postFlush()

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

9

preFlush()

इस विधि को फ्लश से पहले कहा जाता है।

हाइबरनेट इंटरसेप्टर हमें इस बात पर कुल नियंत्रण प्रदान करता है कि कोई वस्तु एप्लिकेशन और डेटाबेस दोनों पर कैसे दिखाई देगी।

इंटरसेप्टर्स का उपयोग कैसे करें?

इंटरसेप्टर बनाने के लिए, आप या तो लागू कर सकते हैं Interceptor सीधे कक्षा या विस्तार EmptyInterceptorकक्षा। निम्नलिखित हाइबरनेट इंटरसेप्टर कार्यक्षमता का उपयोग करने के लिए सरल कदम होंगे।

इंटरसेप्टर बनाएं

हम अपने उदाहरण में EmptyInterceptor का विस्तार करेंगे जहां इंटरसेप्टर की विधि को स्वचालित रूप से कहा जाएगा Employeeऑब्जेक्ट बनाया और अद्यतन किया गया है। आप अपनी आवश्यकताओं के अनुसार अधिक विधियों को लागू कर सकते हैं।

import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;

import org.hibernate.EmptyInterceptor;
import org.hibernate.Transaction;
import org.hibernate.type.Type;

public class MyInterceptor extends EmptyInterceptor {
   private int updates;
   private int creates;
   private int loads;

   public void onDelete(Object entity, Serializable id,
      Object[] state, String[] propertyNames, Type[] types) {
       // do nothing
   }

   // This method is called when Employee object gets updated.
   public boolean onFlushDirty(Object entity, Serializable id,
      Object[] currentState, Object[] previousState, String[] propertyNames,
      Type[] types) {
         if ( entity instanceof Employee ) {
            System.out.println("Update Operation");
            return true; 
         }
         return false;
   }
	
   public boolean onLoad(Object entity, Serializable id,
      Object[] state, String[] propertyNames, Type[] types) {
         // do nothing
         return true;
   }
   
   // This method is called when Employee object gets created.
   public boolean onSave(Object entity, Serializable id,
      Object[] state, String[] propertyNames, Type[] types) {
         if ( entity instanceof Employee ) {
            System.out.println("Create Operation");
            return true; 
         }
         return false;
   }
   
   //called before commit into database
   public void preFlush(Iterator iterator) {
      System.out.println("preFlush");
   }
   
   //called after committed into database
   public void postFlush(Iterator iterator) {
      System.out.println("postFlush");
   }
}

POJO क्लासेस बनाएं

अब, हम अपने पहले उदाहरण को थोड़ा संशोधित करते हैं जहाँ हमने EMPLOYEE तालिका और कर्मचारी वर्ग के साथ खेलने के लिए उपयोग किया है -

public class Employee {
   private int id;
   private String firstName; 
   private String lastName;   
   private int salary;  

   public Employee() {}
   
   public Employee(String fname, String lname, int salary) {
      this.firstName = fname;
      this.lastName = lname;
      this.salary = salary;
   }
   
   public int getId() {
      return id;
   }
   
   public void setId( int id ) {
      this.id = id;
   }
   
   public String getFirstName() {
      return firstName;
   }
   
   public void setFirstName( String first_name ) {
      this.firstName = first_name;
   }
   
   public String getLastName() {
      return lastName;
   }
   
   public void setLastName( String last_name ) {
      this.lastName = last_name;
   }
   
   public int getSalary() {
      return salary;
   }
   
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

डेटाबेस टेबल्स बनाएँ

दूसरा चरण आपके डेटाबेस में तालिकाओं का निर्माण होगा। प्रत्येक ऑब्जेक्ट के अनुरूप एक टेबल होगी, आप दृढ़ता प्रदान करने के लिए तैयार हैं। ऊपर बताई गई वस्तुओं पर विचार करें, निम्नलिखित RDBMS तालिका में संग्रहीत और पुनर्प्राप्त करने की आवश्यकता है -

create table EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

मैपिंग कॉन्फ़िगरेशन फ़ाइल बनाएँ

यह कदम एक मैपिंग फ़ाइल बनाने के लिए है जो हाइबरनेट को निर्देश देता है - डेटाबेस टेबल पर परिभाषित वर्ग या कक्षाओं को कैसे मैप किया जाए।

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
   <class name = "Employee" table = "EMPLOYEE">
      
      <meta attribute = "class-description">
         This class contains the employee detail. 
      </meta>
      
      <id name = "id" type = "int" column = "id">
         <generator class="native"/>
      </id>
      
      <property name = "firstName" column = "first_name" type = "string"/>
      <property name = "lastName" column = "last_name" type = "string"/>
      <property name = "salary" column = "salary" type = "int"/>
      
   </class>
</hibernate-mapping>

एप्लिकेशन क्लास बनाएं

अंत में, हम एप्लिकेशन को चलाने के लिए मुख्य () पद्धति से अपना एप्लिकेशन क्लास बनाएंगे। यहां, यह ध्यान दिया जाना चाहिए कि सत्र ऑब्जेक्ट बनाते समय, हमने एक तर्क के रूप में हमारे इंटरसेप्टर वर्ग का उपयोग किया।

import java.util.List; 
import java.util.Date;
import java.util.Iterator; 
 
import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class ManageEmployee {
   private static SessionFactory factory; 
   public static void main(String[] args) {
      
      try {
         factory = new Configuration().configure().buildSessionFactory();
      } catch (Throwable ex) { 
         System.err.println("Failed to create sessionFactory object." + ex);
         throw new ExceptionInInitializerError(ex); 
      }

      ManageEmployee ME = new ManageEmployee();

      /* Add few employee records in database */
      Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
      Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
      Integer empID3 = ME.addEmployee("John", "Paul", 10000);

      /* List down all the employees */
      ME.listEmployees();

      /* Update employee's records */
      ME.updateEmployee(empID1, 5000);

      /* Delete an employee from the database */
      ME.deleteEmployee(empID2);

      /* List down new list of the employees */
      ME.listEmployees();
   }
   
   /* Method to CREATE an employee in the database */
   public Integer addEmployee(String fname, String lname, int salary){
      Session session = factory.openSession( new MyInterceptor() );
      Transaction tx = null;
      Integer employeeID = null;
      
      try {
         tx = session.beginTransaction();
         Employee employee = new Employee(fname, lname, salary);
         employeeID = (Integer) session.save(employee); 
         tx.commit();
      } catch (HibernateException e) {
         if (tx!=null) tx.rollback();
         e.printStackTrace(); 
      } finally {
         session.close(); 
      }
      return employeeID;
   }
   
   /* Method to  READ all the employees */
   public void listEmployees( ){
      Session session = factory.openSession( new MyInterceptor() );
      Transaction tx = null;
      
      try {
         tx = session.beginTransaction();
         List employees = session.createQuery("FROM Employee").list(); 
         for (Iterator iterator = employees.iterator(); iterator.hasNext();){
            Employee employee = (Employee) iterator.next(); 
            System.out.print("First Name: " + employee.getFirstName()); 
            System.out.print("  Last Name: " + employee.getLastName()); 
            System.out.println("  Salary: " + employee.getSalary()); 
         }
         tx.commit();
      } catch (HibernateException e) {
         if (tx!=null) tx.rollback();
         e.printStackTrace(); 
      } finally {
         session.close(); 
      }
   }
   
   /* Method to UPDATE salary for an employee */
   public void updateEmployee(Integer EmployeeID, int salary ){
      Session session = factory.openSession( new MyInterceptor() );
      Transaction tx = null;
      
      try {
         tx = session.beginTransaction();
         Employee employee = (Employee)session.get(Employee.class, EmployeeID); 
         employee.setSalary( salary );
		 session.update(employee); 
         tx.commit();
      } catch (HibernateException e) {
         if (tx!=null) tx.rollback();
         e.printStackTrace(); 
      } finally {
         session.close(); 
      }
   }
   
   /* Method to DELETE an employee from the records */
   public void deleteEmployee(Integer EmployeeID){
      Session session = factory.openSession( new MyInterceptor() );
      Transaction tx = null;
      
      try {
         tx = session.beginTransaction();
         Employee employee = (Employee)session.get(Employee.class, EmployeeID); 
         session.delete(employee); 
         tx.commit();
      } catch (HibernateException e) {
         if (tx!=null) tx.rollback();
         e.printStackTrace(); 
      } finally {
         session.close(); 
      }
   }
}

संकलन और निष्पादन

उपर्युक्त आवेदन को संकलित करने और चलाने के लिए यहां चरण दिए गए हैं। सुनिश्चित करें, आपने संकलन और निष्पादन के लिए आगे बढ़ने से पहले उचित रूप से PATH और CLASSPATH को सेट किया है।

  • जैसा कि कॉन्फ़िगरेशन अध्याय में समझाया गया है, hibernate.cfg.xml कॉन्फ़िगरेशन फ़ाइल बनाएं।

  • ऊपर दिखाए अनुसार Employee.hbm.xml मैपिंग फ़ाइल बनाएँ।

  • ऊपर दिखाए अनुसार Employee.java स्रोत फ़ाइल बनाएँ और इसे संकलित करें।

  • ऊपर दिखाए अनुसार MyInterceptor.java स्रोत फ़ाइल बनाएँ और इसे संकलित करें।

  • जैसा कि ऊपर दिखाया गया है ManageEmployee.java स्रोत फ़ाइल बनाएँ और इसे संकलित करें।

  • प्रोग्राम को चलाने के लिए ManageEmployee बाइनरी निष्पादित करें।

आपको निम्न परिणाम मिलेगा, और रिकॉर्ड EMPLOYEE तालिका में बनाए जाएंगे।

$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........

Create Operation
preFlush
postFlush
Create Operation
preFlush
postFlush
Create Operation
preFlush
postFlush
First Name: Zara  Last Name: Ali  Salary: 1000
First Name: Daisy  Last Name: Das  Salary: 5000
First Name: John  Last Name: Paul  Salary: 10000
preFlush
postFlush
preFlush
Update Operation
postFlush
preFlush
postFlush
First Name: Zara  Last Name: Ali  Salary: 5000
First Name: John  Last Name: Paul  Salary: 10000
preFlush
postFlush

यदि आप अपनी EMPLOYEE तालिका की जांच करते हैं, तो इसके निम्नलिखित रिकॉर्ड होने चाहिए -

mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara       | Ali       |   5000 |
| 31 | John       | Paul      |  10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>