Hibernate হল একটি ওপেন সোর্স Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশন এবং ডেটাবেসের মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। এটি Java অ্যাপ্লিকেশনকে ডেটাবেসের সাথে কার্যকরভাবে যোগাযোগ করতে সক্ষম করে এবং ডেটাবেস অপারেশনের জন্য JPA (Java Persistence API) সমর্থন করে। Hibernate এর আর্কিটেকচার ডেটাবেসের সাথে অবজেক্ট মডেল (Java objects) ম্যাপিং করতে ব্যবহৃত হয় এবং এটি ডেটাবেসের অপারেশনগুলিকে সহজ এবং আরও পারফরম্যান্ট করে তোলে।
Hibernate এর আর্কিটেকচার মূলত তিনটি গুরুত্বপূর্ণ উপাদানের উপর ভিত্তি করে কাজ করে:
- Hibernate Configuration
- Session Factory
- Session
- Transaction
- Query Language (HQL)
- Persistence Context
এই উপাদানগুলি একসঙ্গে কাজ করে Hibernate-এ ডেটাবেস অপারেশন, ট্রানজ্যাকশন ম্যানেজমেন্ট, এবং অবজেক্ট-পের্সিস্টেন্স ম্যাপিং কার্যকরভাবে সম্পাদন করতে।
Hibernate এর আর্কিটেকচার উপাদানসমূহ
1. Hibernate Configuration
Hibernate configuration ফাইল (hibernate.cfg.xml) ডেটাবেস সংযোগ এবং অন্যান্য কনফিগারেশন সেটিংস নির্ধারণ করে। এই কনফিগারেশন ফাইলটি ডেটাবেসের ইউআরএল, ড্রাইভার, ব্যবহারকারীর নাম, পাসওয়ার্ড, ডায়ালেক্ট, হিবারনেট প্রকৃতির মতো সেটিংস ধারণ করে। Hibernate স্টার্টআপের সময় এই কনফিগারেশন ফাইলটি পড়ে এবং ডেটাবেসের সাথে সংযোগ স্থাপন করে।
Example (hibernate.cfg.xml):
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/yourdb</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
</session-factory>
</hibernate-configuration>
2. Session Factory
Hibernate SessionFactory একটি একক অবজেক্ট যা Hibernate Session তৈরি করে এবং এটি ডেটাবেসে যোগাযোগ স্থাপন করতে ব্যবহৃত হয়। SessionFactory ইনস্ট্যান্স একটি অ্যাপ্লিকেশনের জন্য একমাত্র এবং তা ডেটাবেস সংযোগ পুল ম্যানেজ করে।
SessionFactory একবার তৈরি হলে এটি একটি immutable object এবং এটি অ্যাপ্লিকেশনের পুরো জীবনচক্রে পুনঃব্যবহারযোগ্য। SessionFactory একাধিক Session অবজেক্ট তৈরি করতে পারে, যা ডেটাবেসের সাথে যোগাযোগ করার জন্য ব্যবহার করা হয়।
SessionFactory Initialization Example:
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
3. Session
Hibernate Session হল ডেটাবেস অপারেশন (যেমন সঞ্চয়, আপডেট, এবং রিড) করার জন্য ব্যবহৃত প্রধান অবজেক্ট। এটি SessionFactory দ্বারা তৈরি হয় এবং ডেটাবেসের সাথে সরাসরি যোগাযোগ করতে সহায়ক।
- Session হল short-lived অবজেক্ট এবং per-request (অনুরোধ) ভিত্তিতে তৈরি হয়।
- এটি transaction management পরিচালনা করে এবং ডেটাবেসের CRUD অপারেশন সম্পাদন করে।
- Session অবজেক্টের সাহায্যে Hibernate entity objects রিড, সেভ, আপডেট বা ডিলিট করা যায়।
Session Example:
Session session = factory.getCurrentSession();
4. Transaction
Hibernate ট্রানজ্যাকশন ম্যানেজমেন্টের জন্য Transaction অবজেক্ট ব্যবহার করে, যা ডেটাবেস অপারেশনের নিরাপত্তা নিশ্চিত করতে সাহায্য করে। এটি ডেটাবেসের মধ্যে atomicity, consistency, isolation, and durability (ACID) বজায় রাখতে সাহায্য করে।
- Transaction এর মাধ্যমে আপনি একাধিক ডেটাবেস অপারেশন একত্রে করতে পারেন, এবং একে সফলভাবে কমিট বা রোলব্যাক করা যায়।
Transaction Example:
session.beginTransaction();
// perform operations like save, update, delete
session.getTransaction().commit();
5. Hibernate Query Language (HQL)
Hibernate Query Language (HQL) হল Hibernate-এর জন্য তৈরি করা একটি অপেন-এন্ড (object-oriented) কুয়েরি ভাষা যা SQL এর মতো দেখায়, কিন্তু এটি ডেটাবেসের টেবিলের পরিবর্তে অবজেক্টের উপর কাজ করে।
- HQL ব্যবহার করে আপনি Java objects (এবং তাদের properties) কে ডেটাবেস টেবিলের কলামগুলির সাথে ম্যাপ করতে পারেন।
- HQL হল database-independent; এটি একাধিক ডেটাবেসের জন্য একই কোডের সাথে কাজ করতে সক্ষম।
HQL Example:
String hql = "FROM Employee WHERE id = :employeeId";
Query<Employee> query = session.createQuery(hql);
query.setParameter("employeeId", 1);
Employee employee = query.uniqueResult();
6. Persistence Context
Persistence Context হল একটি জীবনচক্র যেখানে Hibernate নির্দিষ্ট অবজেক্টগুলোকে ট্র্যাক করে এবং তাদের ডেটাবেসে সিঙ্ক্রোনাইজ করে। Hibernate Session এর মধ্যে থাকা অবজেক্টগুলো persistence context এ থাকে, এবং যখন session.commit() করা হয়, তখন অবজেক্টগুলো ডেটাবেসের সাথে সিঙ্ক্রোনাইজ হয়।
- Session অবজেক্টটি persistence context বজায় রাখে এবং first-level cache হিসেবে কাজ করে।
Hibernate Architecture Workflow
- Hibernate Configuration: প্রথমে Hibernate কনফিগারেশন ফাইল (
hibernate.cfg.xml) লোড হয়, যা ডেটাবেসের সাথে সংযোগের জন্য প্রয়োজনীয় কনফিগারেশন তথ্য ধারণ করে। - SessionFactory: SessionFactory তৈরি হয়, যা ডেটাবেস সংযোগ পরিচালনা করতে সহায়ক। এটি একটি singleton অবজেক্ট এবং একবার তৈরি হওয়ার পর এটি বারবার ব্যবহার করা হয়।
- Session: SessionFactory থেকে Session তৈরি হয়, যা ডেটাবেস অপারেশন যেমন save, update, delete, retrieve ইত্যাদি পরিচালনা করে।
- Transaction: সমস্ত ডেটাবেস অপারেশন Transaction এর মধ্যে থাকে, যা ডেটাবেসের ACID গুণাবলী বজায় রাখে।
- Hibernate Query Language (HQL): ডেটা রিড বা ম্যানিপুলেট করতে HQL ব্যবহার করা হয়।
- Persistence Context: Session অবজেক্টের মধ্যে থাকা অবজেক্টগুলো persistence context এ থাকে এবং ডেটাবেসের সাথে সিঙ্ক্রোনাইজ হয়।
Hibernate এর আর্কিটেকচার একটি well-defined এবং modular কাঠামো, যা ডেটাবেসের সাথে অবজেক্ট মডেল ম্যাপিং, ট্রানজ্যাকশন ম্যানেজমেন্ট, এবং পারফরম্যান্স অপটিমাইজেশন সুনির্দিষ্টভাবে পরিচালনা করে। Hibernate এর মূল উপাদান SessionFactory, Session, Transaction, এবং HQL সহ অন্যান্য ফিচারগুলো একসাথে কাজ করে, যা ডেটাবেসের সাথে যোগাযোগের জটিলতাকে সরল এবং কোডকে আরও কার্যকরী করে তোলে।
Hibernate হল একটি ওপেন-সোর্স Java লাইব্রেরি, যা Object-Relational Mapping (ORM) প্রযুক্তি ব্যবহার করে। Hibernate ডেটাবেসের সাথে কাজ করার জন্য Java ক্লাস এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক তৈরি করে, এবং JDBC API ব্যবহারের পরিবর্তে একটি সহজ এবং অধিক কার্যকরী উপায় প্রদান করে।
Hibernate এর মূল উদ্দেশ্য হলো Database independence, persistence management, এবং data transaction management সরবরাহ করা। Hibernate, JPA (Java Persistence API) এর একটি বাস্তবায়ন (implementation) হিসেবে কাজ করে।
Hibernate-এ বিভিন্ন কম্পোনেন্ট এবং অংশ থাকে, যা পুরো ORM প্রক্রিয়াকে সহজ এবং কার্যকরী করে তোলে।
Hibernate Architecture
Hibernate Architecture নিম্নলিখিত প্রধান অংশে বিভক্ত:
- Hibernate Configuration:
- Hibernate কনফিগারেশন ফাইল, যেমন hibernate.cfg.xml, Hibernate কনফিগারেশন সম্পর্কিত সমস্ত প্রয়োজনীয় তথ্য ধারণ করে, যেমন ডাটাবেসের URL, ইউজারনেম, পাসওয়ার্ড, ড্রাইভার, এবং অন্যান্য কনফিগারেশন।
- SessionFactory:
- Hibernate Architecture-এর একটি অত্যন্ত গুরুত্বপূর্ণ অংশ। এটি একটি সিংগেলটন অবজেক্ট যা একবার তৈরি হলে পুরো অ্যাপ্লিকেশনে পুনঃব্যবহার করা হয়। SessionFactory ডেটাবেসের সাথে সংযোগ তৈরি এবং কনফিগারেশন পরিচালনা করে। এটি Session অবজেক্ট তৈরি করতে সাহায্য করে, যা ডেটাবেস অপারেশনগুলি সম্পাদন করে।
- Session:
- Session Hibernate-এর প্রধান অবজেক্ট যা ডেটাবেসের সাথে যোগাযোগ স্থাপন করে। এটি ট্রানজেকশন পরিচালনা এবং ডেটাবেস অপারেশন যেমন সেভ, আপডেট, ডিলিট, এবং কুয়েরি চালানোর জন্য ব্যবহার করা হয়। প্রতিটি Session সাধারণত একটি ডাটাবেস ট্রানজেকশন প্রতিনিধিত্ব করে।
- Transaction:
- Hibernate-এ ট্রানজেকশন ডেটাবেসের একাধিক অপারেশনকে একটি একক ইউনিটে গ্রুপ করে। এটি নিশ্চিত করে যে সমস্ত অপারেশন সফল হলে একযোগে কমিট করা হবে, অন্যথায় রোলব্যাক করা হবে। Hibernate এর মধ্যে JDBC transactions এবং JTA transactions সহ দুটি ধরনের ট্রানজেকশন ব্যবহৃত হয়।
- Query:
- Hibernate-এ HQL (Hibernate Query Language) বা Criteria API এর মাধ্যমে ডেটাবেসে কুয়েরি চালানো হয়। HQL হলো SQL এর মতোই, তবে এটি Java ক্লাস এবং অবজেক্টের উপর ভিত্তি করে তৈরি করা হয়। এটি ডাটাবেসের পরিবর্তে Java অবজেক্টের উপর কাজ করে। Hibernate SQL এর মতোই কুয়েরি তৈরি এবং এক্সিকিউট করতে সক্ষম।
- Persistent Objects:
- Hibernate-এ Java অবজেক্টগুলিকে persistent objects হিসেবে সংজ্ঞায়িত করা হয়। এই অবজেক্টগুলি ডাটাবেসের টেবিলের রেকর্ডের সাথে সম্পর্কিত থাকে এবং তাদের মধ্যে মিলে যায়। Hibernate ক্লাসগুলির সাথে ডেটাবেস টেবিলগুলির মধ্যে সম্পর্ক স্থাপন করার জন্য annotations বা XML মেপিং ব্যবহার করে।
Hibernate Components
Hibernate-এর কিছু প্রধান কম্পোনেন্ট হল:
- Configuration:
- Hibernate কনফিগারেশন ফাইল (hibernate.cfg.xml) অ্যাপ্লিকেশনের জন্য ডেটাবেস কানেকশন তথ্য এবং Hibernate এর কনফিগারেশন সেটিংস প্রদান করে।
- এটি Hibernate এর কার্যকরী পরিচালনার জন্য গুরুত্বপূর্ণ কনফিগারেশন প্যারামিটার যেমন ড্রাইভার, ইউজারনেম, পাসওয়ার্ড, এবং অন্যান্য ডেটাবেস কনফিগারেশন সরবরাহ করে।
- SessionFactory:
- SessionFactory Hibernate-এ একটি সিংগেলটন অবজেক্ট এবং এটি ডেটাবেসের সাথে যোগাযোগ স্থাপন করে এবং Session অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়।
- একটি SessionFactory অবজেক্ট পুরো অ্যাপ্লিকেশন জুড়ে ব্যবহার করা হয় এবং এটি একাধিক Session অবজেক্ট তৈরি করতে পারে। এটি Connection Pooling পরিচালনা করে।
- Session:
- Session Hibernate-এ অবজেক্টের উপরে সমস্ত CRUD (Create, Read, Update, Delete) অপারেশন সম্পাদন করে। এটি ট্রানজেকশন পরিচালনা করে এবং ডেটাবেসের সাথে যোগাযোগ স্থাপন করে।
- এটি ডেটাবেসে Persistent Object তৈরি, আপডেট, ডিলিট এবং কুয়েরি চালানোর জন্য ব্যবহৃত হয়।
- Transaction:
- Transaction Hibernate-এ একাধিক ডেটাবেস অপারেশনকে একটি ইউনিটে অন্তর্ভুক্ত করে। এটি নিশ্চিত করে যে সমস্ত অপারেশন সফল হলে একটি কমিট হয় এবং যদি কোনো সমস্যা হয়, তবে এটি রোলব্যাক করা হয়।
- Query Language (HQL):
- Hibernate Query Language (HQL) হল Hibernate-এর জন্য একটি ডেটাবেস-অ্যাগনস্টিক কুয়েরি ভাষা, যা SQL এর মতোই তবে এটি ডেটাবেস টেবিলের পরিবর্তে Java অবজেক্ট ব্যবহার করে কুয়েরি তৈরি এবং এক্সিকিউট করে।
- Criteria API: এটি HQL-এর একটি বিকল্প, যেখানে আপনি প্রোগ্রাম্যাটিকভাবে কুয়েরি তৈরি করতে পারেন।
- Hibernate Annotations:
- Hibernate ব্যবহারকারীদের জন্য annotations এর মাধ্যমে মডেল ক্লাস এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করা সহজ করে।
@Entity,@Table,@Id,@GeneratedValueইত্যাদি অ্যানোটেশনগুলি ব্যবহার করে ডেটাবেস টেবিলের জন্য Java ক্লাস তৈরি করা যায়।
- Persistence Context:
- এটি Hibernate-এ ডেটাবেসের মধ্যে অবজেক্টগুলির অবস্থা ট্র্যাক করে। অবজেক্ট যখন ডেটাবেসের সাথে সম্পর্কিত থাকে, তখন এটি পেরিস্টেন্ট কনটেক্সটে থাকে এবং যখন এটি ডেটাবেসে পরিবর্তিত হয় তখন এটি আপডেট করা হয়।
Hibernate Architecture Flow
- Configuration File:
hibernate.cfg.xmlবাhibernate.propertiesফাইল দ্বারা কনফিগারেশন লোড হয়। - SessionFactory: কনফিগারেশন থেকে
SessionFactoryতৈরি হয়। - Session: যখন কোনো ডেটাবেস অপারেশন করতে হয়, তখন
Sessionতৈরি করা হয়। - Transaction: সমস্ত ডেটাবেস অপারেশন ট্রানজেকশন সাপোর্ট করে।
- Query Execution:
HQLবাCriteriaব্যবহার করে কুয়েরি এক্সিকিউট করা হয়। - Persisted Objects: অবজেক্ট ডেটাবেসে সেভ, আপডেট বা ডিলিট করা হয়।
Hibernate Architecture Diagram
- Application Layer:
- Java application, which uses Hibernate to interact with the database.
- Hibernate Configuration:
- Hibernate configuration (hibernate.cfg.xml) and settings.
- SessionFactory:
- The
SessionFactoryis created once and provides a way to get the HibernateSession.
- The
- Session:
- It is used to interact with the database and to perform CRUD operations.
- Persistence Context:
- This is where all the objects that are associated with a Hibernate session are kept.
- Database Layer:
- Hibernate interacts with the database using JDBC for actual operations like
INSERT,UPDATE,DELETE, andSELECT.
- Hibernate interacts with the database using JDBC for actual operations like
Hibernate-এর আর্কিটেকচার এবং কম্পোনেন্টগুলি একে একটি শক্তিশালী এবং সহজ ORM ফ্রেমওয়ার্ক হিসেবে তৈরি করেছে, যা ডেটাবেস সম্পর্কিত কাজ সহজ এবং দক্ষভাবে সম্পাদন করতে সহায়ক। SessionFactory, Session, Transaction, এবং Hibernate Query Language এর মাধ্যমে ডেটাবেসের সাথে কার্যকরী যোগাযোগ স্থাপন করা সম্ভব, এবং Annotations এর মাধ্যমে কোডে ডেটাবেস টেবিলের সঙ্গে সম্পর্ক স্থাপন করা সহজ হয়ে যায়।
Hibernate-এ ডেটাবেস অপারেশন এবং ট্রানজেকশন ম্যানেজমেন্ট অত্যন্ত সহজ হয়ে যায়, যা অ্যাপ্লিকেশন উন্নয়ন এবং রক্ষণাবেক্ষণকে অনেক সহজ করে তোলে।
Hibernate একটি শক্তিশালী ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা জাভা অ্যাপ্লিকেশনগুলোকে রিলেশনাল ডাটাবেসের সাথে সহজে ইন্টারঅ্যাক্ট করতে সহায়তা করে। Hibernate-এ SessionFactory, Session, এবং Transaction তিনটি গুরুত্বপূর্ণ কম্পোনেন্ট রয়েছে যা ডাটাবেস অপারেশন এবং ট্রানজেকশন ম্যানেজমেন্ট পরিচালনা করে।
1. SessionFactory:
SessionFactory হলো Hibernate এর একটি গুরুত্বপূর্ণ কনফিগারেশন অবজেক্ট যা ডাটাবেস সংযোগ এবং সেশন পরিচালনা করে। এটি ডাটাবেসের সাথে সংযোগ স্থাপন, সেশনের জন্য কনফিগারেশন এবং ক্লাস লোডিং এর জন্য রিসোর্স তৈরি করতে ব্যবহৃত হয়।
রোল এবং ব্যবহারের ক্ষেত্র:
- SessionFactory একটি thread-safe অবজেক্ট, এবং একাধিক থ্রেডের মধ্যে এটি পুনঃব্যবহার করা যায়।
- এটি Hibernate কনফিগারেশন ডেটা (যেমন
hibernate.cfg.xml) থেকে প্রাপ্ত ডাটাবেস সংযোগের তথ্য ব্যবহার করে। - এটি Session অবজেক্ট তৈরি করে, যা ডাটাবেসের সাথে যোগাযোগ করতে ব্যবহৃত হয়।
SessionFactory কনফিগারেশন উদাহরণ:
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// SessionFactory তৈরি করা
sessionFactory = new Configuration().configure().addAnnotatedClass(MyEntity.class).buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
এখানে, HibernateUtil ক্লাসে Hibernate কনফিগারেশন ফাইলের মাধ্যমে SessionFactory তৈরি করা হয়েছে এবং এটি MyEntity ক্লাসে ম্যাপিং করা হয়েছে।
2. Session:
Session হলো Hibernate এর একটি অবজেক্ট যা ডাটাবেসের সাথে যোগাযোগ করার জন্য ব্যবহৃত হয়। এটি একটি lightweight অবজেক্ট এবং একাধিক থ্রেডের মধ্যে শেয়ার করা হয় না। Session একধরনের CRUD (Create, Read, Update, Delete) অপারেশন পরিচালনা করে এবং ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত হয়।
রোল এবং ব্যবহারের ক্ষেত্র:
- এটি ডেটাবেসের সাথে অবজেক্টের পার্সিস্টেন্স (Persistence) বা স্থায়ীত্ব নিশ্চিত করে।
Sessionএ ব্যবহৃত অপারেশনগুলি Hibernate কনফিগারেশন এবং ডাটাবেসের সাথে সম্পর্কিত কাজগুলো পরিচালনা করে।- এক একটি
Sessionসাধারণত একটি Unit of Work বা একটি ট্রানজেকশনের সমতুল্য। Sessionক্লাসেsave(),update(),delete(),get(),load()মতো মেথড থাকে যা ডাটাবেসের অবজেক্টগুলোকে ম্যানেজ করে।
Session উদাহরণ:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
public class MyDAO {
private SessionFactory sessionFactory;
public MyDAO(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void saveEntity(MyEntity entity) {
// Session তৈরি করা
Session session = sessionFactory.getCurrentSession();
// Transaction শুরু করা
Transaction transaction = session.beginTransaction();
// অবজেক্ট সেভ করা
session.save(entity);
// Transaction কমিট করা
transaction.commit();
}
}
এখানে, sessionFactory.getCurrentSession() ব্যবহার করে একটি Session অবজেক্ট তৈরি করা হয়েছে এবং একটি ট্রানজেকশন শুরু করা হয়েছে। session.save(entity) ব্যবহার করে ডাটাবেসে একটি অবজেক্ট সেভ করা হয়েছে।
3. Transaction:
Transaction Hibernate-এ একটি গুরুত্বপূর্ণ কম্পোনেন্ট যা ডাটাবেস অপারেশনগুলোর গ্রুপকে একত্রিত করে এবং সেগুলোর পারফরম্যান্স ও অ্যাটমিক আচরণ নিশ্চিত করে। এক বা একাধিক CRUD অপারেশন একটি Transaction এর মধ্যে পরিচালিত হয়, এবং সফলভাবে শেষ হলে সেই পরিবর্তনগুলো ডাটাবেসে commit করা হয়।
রোল এবং ব্যবহারের ক্ষেত্র:
- Transaction ডাটাবেসের সমস্ত অপারেশনকে একযোগভাবে পরিচালনা করে। যদি কোনো একটি অপারেশন ব্যর্থ হয়, তবে পুরো ট্রানজেকশনটি rollback করা যায়, যা ডাটাবেসের অপরিবর্তিত অবস্থা নিশ্চিত করে।
- Atomicity: এক বা একাধিক অপারেশন একসাথে সম্পন্ন না হলে, তা বাতিল করা হয় এবং পূর্বাবস্থায় ফিরে আসে।
- Consistency: একটি সফল ট্রানজেকশনের পর ডাটাবেস সবসময় একটি বৈধ অবস্থা বজায় রাখে।
- Isolation: একাধিক ট্রানজেকশন যখন সমান্তরালভাবে চলে, তখন একটির ফলাফল অন্যটির ওপর প্রভাব ফেলবে না।
Transaction উদাহরণ:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
public class MyDAO {
private SessionFactory sessionFactory;
public MyDAO(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void saveEntity(MyEntity entity) {
// Session তৈরি করা
Session session = sessionFactory.getCurrentSession();
// Transaction শুরু করা
Transaction transaction = session.beginTransaction();
try {
// অবজেক্ট সেভ করা
session.save(entity);
// Transaction কমিট করা
transaction.commit();
} catch (Exception e) {
// Exception হলে Rollback করা
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
}
}
এখানে, beginTransaction() মেথড দিয়ে ট্রানজেকশন শুরু করা হয়েছে, এবং সফলভাবে session.save() মেথড দিয়ে অবজেক্ট সেভ করার পরে commit() মেথড ব্যবহার করে ট্রানজেকশন নিশ্চিত করা হয়েছে। যদি কোনো সমস্যা হয়, তবে rollback() মেথড দিয়ে ডাটাবেসের পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনা হয়।
Summary:
- SessionFactory:
- এটি Hibernate কনফিগারেশন ব্যবহার করে Session তৈরি করতে সহায়ক এবং ডাটাবেস সংযোগ পরিচালনা করে। এটি একটি thread-safe অবজেক্ট যা একাধিক থ্রেডের মধ্যে শেয়ার করা যেতে পারে।
- Session:
- এটি ডাটাবেসে অবজেক্ট সেভ, লোড, আপডেট, ডিলিট এবং অন্যান্য অপারেশন করার জন্য ব্যবহৃত হয়। এটি একটি Unit of Work ধারণা তৈরি করে এবং একে অন্যের সাথে সম্পর্কযুক্ত CRUD অপারেশনগুলির মধ্যে সমন্বয় করে।
- Transaction:
- এটি একাধিক ডাটাবেস অপারেশনকে একত্রিত করে এবং তা একযোগভাবে commit বা rollback করে। এটি atomicity এবং consistency নিশ্চিত করতে ব্যবহৃত হয়।
এভাবে, SessionFactory, Session, এবং Transaction Hibernate-এ গুরুত্বপূর্ণ ভূমিকা পালন করে এবং ডাটাবেসের সাথে কার্যকরীভাবে কাজ করতে সহায়ক।
Hibernate: Working Flow
Hibernate হলো একটি জনপ্রিয় Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশনের ডাটাবেসের সাথে যোগাযোগের জন্য ব্যবহৃত হয়। Hibernate ডেভেলপারদের জন্য Java অবজেক্টগুলিকে ডাটাবেস টেবিলের সারির সাথে মাপসই করতে সহজ করে তোলে, এবং এটি JDBC (Java Database Connectivity) এর চেয়ে অনেক বেশি কার্যকরী এবং সুবিধাজনক। Hibernate ORM ডেটাবেস অপারেশনের জন্য CRUD (Create, Read, Update, Delete) অপারেশনগুলো স্বয়ংক্রিয়ভাবে পরিচালনা করে।
Hibernate এর কাজের প্রবাহ (Working Flow) সাধারনত ৬টি প্রধান পর্যায়ে বিভক্ত:
Hibernate Working Flow
1. Configuration Phase (Hibernate Configuration)
Hibernate ব্যবহারের প্রথম ধাপ হলো configuration সেট করা। Hibernate-কে ডাটাবেসের সাথে সংযোগ করতে একটি কনফিগারেশন ফাইল (hibernate.cfg.xml) প্রয়োজন হয়, যাতে ডাটাবেস সংযোগের বিস্তারিত যেমন JDBC ইউআরএল, ইউজারনেম, পাসওয়ার্ড এবং ড্রাইভার ক্লাস থাকে। এছাড়া hibernate.cfg.xml ফাইলটি হাইবারনেটের সমস্ত প্রয়োজনীয় কনফিগারেশন সেট করে দেয়, যেমন ডাটাবেসের হিব্রিডেটিং কৌশল এবং ক্যাশিং কনফিগারেশন।
hibernate.cfg.xml ফাইলের উদাহরণ:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/yourdb</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<!-- JDBC connection pool settings -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- Specify dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL to stdout -->
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
</session-factory>
</hibernate-configuration>
2. SessionFactory Creation
Hibernate কনফিগারেশন ফাইলটির মাধ্যমে SessionFactory তৈরি করা হয়। SessionFactory হলো Hibernate এর মস্তিষ্ক, যা Session অবজেক্ট তৈরি করতে ব্যবহৃত হয়। SessionFactory একবার তৈরি হলে, এটি সিস্টেমের মাধ্যমে পুনরায় ব্যবহৃত হতে পারে।
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
এখানে Employee.class হলো একটি mapped entity ক্লাস, যা Hibernate-কে ডাটাবেস টেবিলের সাথে সম্পর্কিত করে।
3. Session Creation
SessionFactory তৈরি হওয়ার পর, Hibernate এর Session অবজেক্ট তৈরি করা হয়। Session হল Hibernate এর সাথে ডাটাবেসের ইন্টারঅ্যাকশন করার জন্য ব্যবহৃত প্রধান অবজেক্ট। এটি CRUD operations (Create, Read, Update, Delete) পরিচালনা করতে সাহায্য করে।
Session session = factory.getCurrentSession();
4. Begin Transaction
Hibernate এ ডাটাবেস অপারেশন (যেমন, ইনসার্ট, আপডেট, ডিলিট) করতে transaction শুরু করা প্রয়োজন। এটি ডাটাবেস অপারেশনগুলোকে একটি একক ইউনিট হিসেবে কার্যকর করতে সাহায্য করে, যার ফলে ডেটা সঠিকভাবে আপডেট হয় এবং এক্সেপশন বা অন্য কোনো সমস্যা হলে রোলব্যাক করা যায়।
session.beginTransaction();
5. Perform CRUD Operations
এবার আপনি Hibernate এর মাধ্যমে ডাটাবেসে CRUD (Create, Read, Update, Delete) অপারেশন করতে পারবেন। Hibernate জাভা অবজেক্টগুলোকে ডাটাবেস টেবিলের সারিতে ম্যাপ করতে ব্যবহৃত হয়।
- Create (Insert):
Employee employee = new Employee("John", "Doe", "john.doe@example.com");
session.save(employee);
- Read (Select):
Employee employee = session.get(Employee.class, 1);
System.out.println(employee);
- Update:
employee.setEmail("john.doe@newdomain.com");
session.update(employee);
- Delete:
session.delete(employee);
6. Commit Transaction
ডাটাবেস অপারেশন সম্পন্ন হওয়ার পর transaction কমিট করতে হয়। এটি ডাটাবেসে পরিবর্তনগুলো স্থায়ী করে দেয়।
session.getTransaction().commit();
7. Close the Session
অপারেশন শেষে সেশন বন্ধ করা প্রয়োজন। এটি সেশনটির সকল রিসোর্স মুক্ত করে দেয় এবং ডাটাবেসের সাথে সংযোগ বন্ধ করে।
session.close();
Hibernate Working Flow: Summary
- Hibernate Configuration:
hibernate.cfg.xmlফাইলের মাধ্যমে ডাটাবেস কনফিগারেশন নির্ধারণ করা হয়। - SessionFactory Creation:
SessionFactoryতৈরি হয় যা পরবর্তীতে সেশন তৈরি করার জন্য ব্যবহৃত হয়। - Session Creation:
Sessionঅবজেক্ট তৈরি করা হয়, যা ডাটাবেসের সাথে যোগাযোগের জন্য ব্যবহৃত হয়। - Begin Transaction: ট্রানজেকশন শুরু হয় যাতে ডাটাবেস অপারেশন একটি একক ইউনিট হিসেবে কার্যকর হতে পারে।
- Perform CRUD Operations: ডাটাবেসে CRUD অপারেশনগুলো (Create, Read, Update, Delete) পরিচালনা করা হয়।
- Commit Transaction: ট্রানজেকশন কমিট করা হয়, যাতে ডাটাবেসের পরিবর্তনগুলি স্থায়ী হয়।
- Close the Session: সেশন বন্ধ করা হয় এবং সমস্ত রিসোর্স মুক্ত করা হয়।
Hibernate এর কাজের প্রবাহ (working flow) খুবই সোজা এবং কার্যকরী। এটি ডাটাবেসের সাথে সংযোগ স্থাপন, অবজেক্টগুলোকে ডাটাবেস টেবিলের সাথে ম্যাপ করা, এবং CRUD অপারেশনগুলো সহজে পরিচালনা করার জন্য একটি শক্তিশালী টুল। এই প্রবাহটি সঠিকভাবে অনুসরণ করলে, আপনি Hibernate-এ কার্যকরভাবে ডেটাবেস অপারেশন সম্পাদন করতে পারবেন এবং আপনার অ্যাপ্লিকেশনকে আরও মডুলার এবং স্কেলেবল বানাতে পারবেন।
Hibernate হল একটি Java ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা Java ক্লাসগুলোকে ডেটাবেস টেবিলের সাথে ম্যাপিং করার জন্য ব্যবহৃত হয়। Hibernate ডেটাবেস অপারেশন সহজ করে তোলে, যেমন ইনসার্ট, আপডেট, ডিলিট এবং সিলেক্ট। Hibernate কনফিগারেশন সাধারণত দুইটি উপায়ে করা হয়:
hibernate.cfg.xml(XML কনফিগারেশন)- Annotations (অ্যানোটেশন ব্যবহার করে কনফিগারেশন)
এখানে Hibernate Configuration এর বিস্তারিত আলোচনা করা হবে, যেখানে hibernate.cfg.xml এবং Annotations ব্যবহার করে কনফিগারেশন কিভাবে করা যায় তা দেখানো হবে।
1. Hibernate Configuration via hibernate.cfg.xml
Hibernate ফ্রেমওয়ার্কের hibernate.cfg.xml ফাইলটি ডেটাবেসের সাথে সংযোগ স্থাপন এবং Hibernate সেশন ফ্যাকটরি কনফিগার করার জন্য ব্যবহৃত হয়। এটি সাধারণত src/main/resources ফোল্ডারে রাখা হয়।
hibernate.cfg.xml Example:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- JDBC Database connection settings -->
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database_name</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<!-- JDBC connection pool settings -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- Specify dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Echo all executed SQL to stdout -->
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.c3p0.validate">true</property>
<!-- Disable the second-level cache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
Key Properties in hibernate.cfg.xml:
hibernate.connection.driver_class: ড্রাইভার ক্লাস যা JDBC কানেকশনের জন্য ব্যবহৃত হয়।hibernate.connection.url: ডাটাবেস URL।hibernate.connection.usernameএবংhibernate.connection.password: ডাটাবেসের ইউজারনেম এবং পাসওয়ার্ড।hibernate.dialect: Hibernate এর জন্য ডেটাবেস ডায়ালেক্ট (এটি Hibernate কে বলে দেয় ডেটাবেসের সাথে কিভাবে কাজ করতে হবে)।hibernate.show_sql: এটি Hibernate কে বলে দেয় যে SQL কোয়েরি আউটপুটে প্রদর্শন করতে হবে কিনা।hibernate.hbm2ddl.auto: Hibernate এর স্কিমা অটো-জেনারেট করার জন্য ব্যবহৃত হয়, যেমনupdate,create, বাcreate-drop।
2. Hibernate Configuration via Annotations
Hibernate এ Annotations ব্যবহার করে কনফিগারেশন অনেক সহজ এবং কোড-সেন্ট্রিক পদ্ধতি। আপনি Java ক্লাসে JPA (Java Persistence API) অ্যানোটেশন ব্যবহার করে Hibernate সেটআপ করতে পারেন।
Steps for Hibernate with Annotations:
Hibernate Entity Class with Annotations: Hibernate Entity Class (Java Bean) তৈরি করুন এবং এটি
@Entity,@Table,@Idইত্যাদি অ্যানোটেশন দ্বারা চিহ্নিত করুন।import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "student") public class Student { @Id private int id; private String name; private String course; // Getters and setters public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } }এখানে,
@Entityক্লাসটিকে Hibernate Entity হিসেবে চিহ্নিত করে এবং@Tableএটি কী টেবিলের সাথে ম্যাপ করা হবে তা নির্ধারণ করে।@Idঅ্যানোটেশনটি সেই ফিল্ডকে চিহ্নিত করে যেটি প্রাইমারি কী হিসেবে কাজ করবে।Hibernate Configuration Class (HibernateUtil): আপনি Hibernate সেশন ফ্যাকটরি তৈরি করতে একটি Utility ক্লাস তৈরি করতে পারেন যা Hibernate সেটআপ পরিচালনা করবে।
import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static { try { // Create the SessionFactory from hibernate.cfg.xml sessionFactory = new Configuration().configure("hibernate.cfg.xml") .addAnnotatedClass(Student.class) // Adding annotated class .buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { getSessionFactory().close(); } }এখানে,
addAnnotatedClass()ব্যবহার করে Hibernate Entity ক্লাসটি সেশন ফ্যাকটরিতে অ্যাড করা হয়েছে।Main Class to Test Hibernate Configuration: Hibernate সেশন ফ্যাকটরি ব্যবহার করে ডেটাবেসে ডেটা ইনসার্ট এবং রিট্রিভ করার জন্য Main ক্লাস লিখুন।
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; public class MainApp { public static void main(String[] args) { SessionFactory factory = HibernateUtil.getSessionFactory(); Session session = factory.getCurrentSession(); try { // Create a new Student object Student student = new Student(); student.setName("John Doe"); student.setCourse("Java Programming"); // Start a transaction session.beginTransaction(); // Save the student object session.save(student); // Commit the transaction session.getTransaction().commit(); } finally { factory.close(); } } }এই ক্লাসে:
- Hibernate সেশন ফ্যাকটরি এবং সেশন তৈরি করা হয়েছে।
- একটি
Studentঅবজেক্ট তৈরি করা হয়েছে এবং ডেটাবেসে সেভ করা হয়েছে।
Key Differences between hibernate.cfg.xml and Annotations Configuration:
| ফিচার | hibernate.cfg.xml | Annotations |
|---|---|---|
| Configuration Style | XML ফাইল ব্যবহার করা হয়। | Java ক্লাসে অ্যানোটেশন ব্যবহার করা হয়। |
| Ease of Use | কিছুটা বেশি জটিল, বড় XML ফাইল লাগে। | কমপ্যাক্ট এবং কোড-সেন্ট্রিক, অ্যানোটেশন সরাসরি ব্যবহার করা যায়। |
| Flexibility | XML ফাইল দ্বারা কনফিগারেশন করা যায়, সেন্ট্রাল কনফিগারেশন। | Java ক্লাসে কনফিগারেশন, কোডের মধ্যে থাকতে পারে। |
| Maintainability | বেশি সেন্ট্রালাইজড, সব কনফিগারেশন এক জায়গায় থাকে। | কোডের মধ্যে ইনলাইন কনফিগারেশন যা সহজে রিফ্যাক্টর করা যায়। |
| Validation | XML Schema দ্বারা কনফিগারেশন বৈধকরণ। | অ্যানোটেশন দ্বারা সরাসরি টাইপ চেকিং। |
hibernate.cfg.xml: এটি ঐতিহ্যবাহী কনফিগারেশন পদ্ধতি যেখানে XML ফাইলে সমস্ত কনফিগারেশন স্টেটমেন্ট থাকে। এটি বেশি কনফিগারেবল, তবে কিছুটা ভারী হতে পারে এবং XML স্কিমা ফাইল ব্যবহারের প্রয়োজন হতে পারে।- Annotations: এটি সহজ এবং কোড-সেন্ট্রিক কনফিগারেশন পদ্ধতি, যেখানে Java ক্লাসে সরাসরি অ্যানোটেশন ব্যবহার করা হয়। এটি বেশি কমপ্যাক্ট এবং রিফ্যাক্টরিং সহজ, তবে এটি একটু কম কনফিগারেবল হতে পারে।
উপযুক্ত কনফিগারেশন পদ্ধতি নির্বাচন নির্ভর করে আপনার প্রকল্পের আকার এবং প্রয়োজনীয়তার উপর।
Read more