Spring Framework-এর মধ্যে Hibernate Transaction Management একটি গুরুত্বপূর্ণ অংশ, যা আপনাকে ডাটাবেসে ট্রানজেকশন পরিচালনা করতে সহায়ক। Spring এর transaction management-এর মাধ্যমে Hibernate-এর Session এবং Transaction কন্ট্রোল করতে পারে। Spring Transaction Management আপনাকে declarative এবং programmatic দুই ধরনের পদ্ধতিতে ট্রানজেকশন পরিচালনা করতে দেয়।
Spring-এর Hibernate Transaction Management-এর মাধ্যমে আপনি commit এবং rollback এর মত কাজগুলো সহজভাবে করতে পারবেন, এবং Hibernate এর ডেটাবেস অপারেশনগুলো নিরাপদভাবে পরিচালনা করতে পারবেন।
Spring Framework-এর Transaction Management Types:
- Declarative Transaction Management (using annotations or XML configuration)
- Programmatic Transaction Management (using the
PlatformTransactionManagerinterface)
আমরা এখানে Declarative Transaction Management এবং Programmatic Transaction Management উভয়ের সাথে Hibernate ট্রানজেকশন ম্যানেজমেন্টের উদাহরণ দেখাবো।
1. Declarative Transaction Management Using Annotations
Spring-এর @Transactional অ্যানোটেশন দিয়ে আপনি ট্রানজেকশন ম্যানেজমেন্ট declaratively করতে পারেন। Spring তখন আপনার ট্রানজেকশন কমপ্লিট বা রোলব্যাক করার জন্য প্রয়োজনীয় কাজটি করবে।
Step 1: Hibernate Configuration and Spring Setup
প্রথমে, Spring এবং Hibernate কনফিগারেশন সেটআপ করা দরকার।
hibernate.cfg.xml (Hibernate কনফিগারেশন)
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:testdb</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Show SQL -->
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="com.example.hibernate.Employee"/>
</session-factory>
</hibernate-configuration>
Spring Context Configuration (applicationContext.xml)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Hibernate SessionFactory configuration -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.example.hibernate" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- DataSource Bean -->
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:testdb"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<!-- Transaction Manager Bean -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Enable @Transactional annotations -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
Step 2: Create a DAO with @Transactional Annotations
এখন আপনি DAO (Data Access Object) তৈরি করবেন যেখানে Hibernate-এ Session ব্যবহৃত হবে এবং আপনি @Transactional অ্যানোটেশন ব্যবহার করবেন।
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@Repository
public class EmployeeDAO {
private SessionFactory sessionFactory;
// Injecting sessionFactory using constructor
public EmployeeDAO(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// Annotating method to manage transactions
@Transactional
public void saveEmployee(Employee employee) {
Session session = sessionFactory.getCurrentSession();
session.save(employee);
}
@Transactional
public void updateEmployee(Employee employee) {
Session session = sessionFactory.getCurrentSession();
session.update(employee);
}
}
এখানে:
@Transactionalঅ্যানোটেশনটি ট্রানজেকশন পরিচালনা করতে সাহায্য করে। যদিsaveEmployeeবাupdateEmployeeমেথডে কোনো সমস্যা হয়, তাহলে Spring নিজে থেকেই ট্রানজেকশন rollback করবে।- Spring এর Transaction Manager স্বয়ংক্রিয়ভাবে ট্রানজেকশন শুরু এবং শেষ করবে। Commit করার জন্য
session.save()বাsession.update()ব্যবহার করা হয়।
Step 3: Service Class with Transactional Methods
এখন, আপনি EmployeeService ক্লাস তৈরি করতে পারেন যা DAO ব্যবহার করবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
private EmployeeDAO employeeDAO;
public void addEmployee(Employee employee) {
employeeDAO.saveEmployee(employee);
}
public void updateEmployee(Employee employee) {
employeeDAO.updateEmployee(employee);
}
}
Step 4: Main Application to Test
এখন, MainApp ক্লাস তৈরি করুন এবং Spring context লোড করে Hibernate Transaction Management পরীক্ষা করুন।
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainApp {
public static void main(String[] args) {
// Load Spring context
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Get EmployeeService bean
EmployeeService employeeService = context.getBean(EmployeeService.class);
// Create Employee object
Employee newEmployee = new Employee("John Doe");
// Add employee
employeeService.addEmployee(newEmployee);
// Close the context
context.close();
}
}
2. Programmatic Transaction Management Using PlatformTransactionManager
Spring Frameworkে Programmatic Transaction Management ব্যবহার করে, আপনি স্বয়ংক্রিয়ভাবে ট্রানজেকশন শুরু, কমিট বা রোলব্যাক করতে পারেন। এতে আপনাকে PlatformTransactionManager এবং TransactionStatus ব্যবহার করতে হবে।
Example: Programmatic Transaction Management
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
public class EmployeeService {
private PlatformTransactionManager transactionManager;
public EmployeeService(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void addEmployee(Employee employee) {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// Start transaction
// Perform Hibernate operations (e.g., saving employee)
session.save(employee);
// Commit the transaction
transactionManager.commit(status);
} catch (Exception e) {
// Rollback transaction in case of error
transactionManager.rollback(status);
throw new RuntimeException("Transaction failed", e);
}
}
}
এখানে:
PlatformTransactionManagerএবংTransactionStatusব্যবহার করে স্বয়ংক্রিয়ভাবে ট্রানজেকশন শুরু, কমিট, এবং রোলব্যাক করা হয়েছে।
- Declarative Transaction Management: Spring এ
@Transactionalঅ্যানোটেশন ব্যবহার করে আপনি সহজেই ট্রানজেকশন পরিচালনা করতে পারেন। Hibernate এর ডেটাবেস অপারেশনগুলো স্বয়ংক্রিয়ভাবে ট্রানজেকশনের মধ্যে আবদ্ধ হয়ে যায়, এবং যদি কোনো সমস্যা ঘটে, তাহলে Spring ট্রানজেকশন rollback করবে। - Programmatic Transaction Management: আপনি PlatformTransactionManager এবং TransactionStatus ব্যবহার করে স্বয়ংক্রিয়ভাবে ট্রানজেকশন শুরু এবং শেষ করতে পারেন। এটি তখন ব্যবহার করা হয় যখন আপনি ট্রানজেকশন ম্যানেজমেন্টকে কাস্টমাইজ করতে চান।
Spring এর Hibernate Transaction Management এর মাধ্যমে আপনি ডাটাবেস অপারেশনগুলোকে Atomic, Consistent, Isolated, এবং Durable রাখতে পারবেন।
Read more