Java Technologies Spring এর মাধ্যমে Hibernate Transaction Management গাইড ও নোট

304

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:

  1. Declarative Transaction Management (using annotations or XML configuration)
  2. Programmatic Transaction Management (using the PlatformTransactionManager interface)

আমরা এখানে 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 রাখতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...