Spring ORM এর সেটআপ এবং কনফিগারেশন

স্প্রিং ওআরএম (Spring ORM) - Java Technologies

252

স্প্রিং ORM (Object-Relational Mapping) হল Spring Framework-এর একটি মডিউল, যা জাভা অ্যাপ্লিকেশন এবং ডাটাবেসের মধ্যে সংযোগ সহজতর করে। এটি Hibernate, JPA (Java Persistence API), JDO (Java Data Objects), এবং অন্যান্য ORM টুলের সাথে কাজ করার জন্য ব্যবহার করা হয়।

স্প্রিং ORM সরাসরি ডাটাবেসের সাথে কাজ না করে ORM টুলের মাধ্যমে ডেটা ট্রান্সফার করে। এর ফলে, অ্যাপ্লিকেশনের কোড পরিষ্কার এবং সংক্ষিপ্ত থাকে।


স্প্রিং ORM সেটআপের জন্য প্রয়োজনীয় পদক্ষেপ

১. প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করা

Spring ORM সেটআপের জন্য Maven বা Gradle-এ প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করতে হবে। নিচে Maven-এ Hibernate এবং Spring ORM-এর জন্য ডিপেন্ডেন্সি দেওয়া হলো:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>5.3.29</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.6.15.Final</version>
</dependency>
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.1.214</version>
</dependency>

২. ডাটাবেস কনফিগারেশন

ডাটাবেসের সাথে সংযোগ করার জন্য application.properties বা application.yml ফাইলে ডাটাবেস কনফিগারেশন করতে হবে। উদাহরণস্বরূপ:

application.properties:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
hibernate.dialect=org.hibernate.dialect.H2Dialect

স্প্রিং ORM কনফিগারেশন

১. Hibernate Configuration Bean তৈরি করা

Spring ORM Hibernate-এর জন্য একটি SessionFactory তৈরি করতে হবে। নিচে একটি উদাহরণ দেওয়া হলো:

import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class HibernateConfig {

    @Bean
    public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setPackagesToScan("com.example.entity");
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.hbm2ddl.auto", "update");
        return properties;
    }
}

২. ট্রানজ্যাকশন ম্যানেজমেন্ট কনফিগারেশন

Spring ORM ট্রানজ্যাকশন পরিচালনার জন্য PlatformTransactionManager ব্যবহার করে। নিচে একটি উদাহরণ দেওয়া হলো:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class TransactionConfig {

    @Bean
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
        return new HibernateTransactionManager(sessionFactory);
    }
}

স্প্রিং ORM-এ DAO ইমপ্লিমেন্ট করা

DAO Interface:

import java.util.List;

public interface UserDao {
    void saveUser(User user);
    List<User> getAllUsers();
}

DAO Implementation:

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    @Override
    public void saveUser(User user) {
        sessionFactory.getCurrentSession().save(user);
    }

    @Transactional(readOnly = true)
    @Override
    public List<User> getAllUsers() {
        return sessionFactory.getCurrentSession().createQuery("from User", User.class).list();
    }
}

উপসংহার

স্প্রিং ORM Hibernate বা অন্যান্য ORM টুলের মাধ্যমে জাভা অ্যাপ্লিকেশন এবং ডাটাবেসের মধ্যে যোগাযোগ সহজ করে। সঠিকভাবে সেটআপ এবং কনফিগারেশন করলে এটি কোডের জটিলতা কমায় এবং ডাটাবেস সংক্রান্ত কাজকে আরও কার্যকর করে তোলে।

Content added By

স্প্রিং ফ্রেমওয়ার্কে Spring ORM (Object-Relational Mapping) একটি গুরুত্বপূর্ণ মডিউল যা ডাটাবেস অ্যাক্সেসকে সহজ করে। এটি Hibernate, JPA (Java Persistence API), এবং অন্যান্য ORM টুলের সঙ্গে ইন্টিগ্রেশন করে। এটি ডেভেলপারদের ডাটাবেসের জটিলতা থেকে মুক্তি দিয়ে আরও কার্যকরভাবে ডাটাবেস ম্যানেজমেন্ট করতে সাহায্য করে।

Spring ORM এর মাধ্যমে ডাটাবেস ট্রানজ্যাকশন, অটোমেটেড ডেটা ম্যাপিং এবং কোড পুনর্ব্যবহারের সুবিধা পাওয়া যায়।


Maven দিয়ে Spring ORM অন্তর্ভুক্ত করা

Maven Dependency যোগ করার ধাপ

১. Pom.xml ফাইল খুলুন।
২. নিচের ডিপেনডেন্সিগুলি ট্যাগের মধ্যে যোগ করুন:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>5.3.30</version>
</dependency>
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.6.15.Final</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.30</version>
</dependency>

Maven ব্যবহার করলে, এই ডিপেনডেন্সিগুলি Maven Central Repository থেকে স্বয়ংক্রিয়ভাবে ডাউনলোড হবে।


Gradle দিয়ে Spring ORM অন্তর্ভুক্ত করা

Gradle Dependency যোগ করার ধাপ

১. build.gradle ফাইল খুলুন।
২. নিচের ডিপেনডেন্সিগুলি dependencies ব্লকের মধ্যে যোগ করুন:

implementation 'org.springframework:spring-orm:5.3.30'
implementation 'javax.persistence:javax.persistence-api:2.2'
implementation 'org.hibernate:hibernate-core:5.6.15.Final'
implementation 'org.springframework:spring-tx:5.3.30'

Gradle ব্যবহার করলে, ডিপেনডেন্সিগুলি Gradle Build Tool দ্বারা স্বয়ংক্রিয়ভাবে ডাউনলোড এবং প্রজেক্টে অন্তর্ভুক্ত হবে।


Dependency সংযোজনের পরে করণীয়

১. Spring Configuration File বা Java-based Configuration তৈরি করুন। ২. Hibernate বা JPA-এর জন্য SessionFactory বা EntityManager সেটআপ করুন।
৩. ডাটাবেসের ট্রানজ্যাকশন ম্যানেজমেন্টের জন্য @Transactional অ্যানোটেশন ব্যবহার করুন।


Spring ORM প্রজেক্টে অন্তর্ভুক্ত করা হলে এটি ডেটাবেস অ্যাক্সেসের কাজকে আরও সহজ এবং কার্যকর করে তোলে।

Content added By

স্প্রিং ওআরএম (Spring Object Relational Mapping) হল স্প্রিং ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ মডিউল, যা Hibernate, JPA (Java Persistence API) এবং অন্যান্য ORM টুলের সঙ্গে একীভূত হতে সাহায্য করে। এটি ডেটাবেস অপারেশন সহজ ও দক্ষ করে এবং Boilerplate কোড কমিয়ে দেয়।

স্প্রিং ORM মডিউল বিশেষত Spring Framework এবং Spring Boot এ ব্যবহৃত হয়, যেখানে ডেটাবেস-সংক্রান্ত কাজগুলো আরো দ্রুত এবং সহজভাবে করা যায়।


Spring ORM এর প্রধান ফিচারসমূহ

  • ইন্টিগ্রেশন সুবিধা: Hibernate, JPA, JDO, এবং Apache OJB-এর মতো ORM টুলের সঙ্গে সহজ ইন্টিগ্রেশন।
  • Declarative Transaction Management: অ্যানোটেশন-ভিত্তিক ট্রান্স্যাকশন ম্যানেজমেন্ট।
  • Boilerplate কোড কমানো: DAO লেয়ারের জন্য অত্যন্ত কম কোড লিখে ডেটাবেস অপারেশন।
  • Exception Translation: Hibernate বা JPA এর Exception গুলো Spring DataAccessException-এ রূপান্তর করে।

Spring Boot এবং Spring Framework-এ ORM কনফিগারেশন

Hibernate এর সাথে Spring ORM কনফিগারেশন

Dependencies যোগ করা

Spring Boot প্রোজেক্টে Maven বা Gradle ব্যবহার করে Hibernate এবং JPA এর জন্য নিচের ডিপেন্ডেন্সি যোগ করতে হয়:

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle:

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'

অ্যাপ্লিকেশন প্রোপার্টিজ (application.properties) কনফিগারেশন

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Hibernate Entity তৈরি

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String department;

    // Getters and Setters
}

Spring Data JPA Repository

import org.springframework.data.jpa.repository.JpaRepository;

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

সেবাসেবা বা সার্ভিস লেয়ার

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    public List<Employee> getAllEmployees() {
        return employeeRepository.findAll();
    }

    public Employee saveEmployee(Employee employee) {
        return employeeRepository.save(employee);
    }
}

কন্ট্রোলার লেয়ার

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/employees")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @GetMapping
    public List<Employee> getAllEmployees() {
        return employeeService.getAllEmployees();
    }

    @PostMapping
    public Employee createEmployee(@RequestBody Employee employee) {
        return employeeService.saveEmployee(employee);
    }
}

Spring Framework-এ ORM কনফিগারেশন

Spring Framework-এ XML বা Java Configuration দিয়ে ORM সেটআপ করা হয়।

Hibernate Configuration (Java-Based)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;

import javax.sql.DataSource;

@Configuration
public class HibernateConfig {

    @Bean
    public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setPackagesToScan("com.example.model");
        return sessionFactory;
    }
}

Spring ORM ডেটাবেস এবং জাভার মধ্যে এক মসৃণ সংযোগ স্থাপন করে, যার ফলে ডেভেলপারদের কোড সহজ ও মেইনটেইনেবল হয়।

Content added By

ডেটাবেস কনফিগারেশন application.properties ফাইলে

স্প্রিং ওআরএম ব্যবহার করে একটি ডেটাবেসের সাথে অ্যাপ্লিকেশন সংযুক্ত করার জন্য ডেটাবেস কনফিগারেশন সাধারণত application.properties ফাইলে রাখা হয়। নিচে উদাহরণ হিসেবে MySQL ডেটাবেসের জন্য কনফিগারেশন দেখানো হলো:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

প্রধান বৈশিষ্ট্য:

  • spring.datasource.url: ডেটাবেস সার্ভারের URL। এখানে jdbc:mysql://localhost:3306/your_database_name ব্যবহার করা হয়েছে।
  • spring.datasource.username: ডেটাবেসে অ্যাক্সেসের জন্য ব্যবহারকারীর নাম।
  • spring.datasource.password: ডেটাবেসে অ্যাক্সেসের জন্য পাসওয়ার্ড।
  • spring.datasource.driver-class-name: JDBC ড্রাইভারের ক্লাস।
  • spring.jpa.hibernate.ddl-auto: Hibernate এর জন্য DDL অপশন। এখানে update ব্যবহৃত হয়েছে, যা ডেটাবেস স্কিমা স্বয়ংক্রিয়ভাবে আপডেট করে।
  • spring.jpa.show-sql: Hibernate কোয়েরি দেখানোর জন্য।
  • spring.jpa.properties.hibernate.dialect: Hibernate এর জন্য ডায়ালেক্ট।

ডেটাবেস কনফিগারেশন application.yml ফাইলে

application.yml ফাইল YAML ফরম্যাটে ডেটাবেস কনফিগারেশন সংরক্ষণ করে। নিচে MySQL ডেটাবেসের উদাহরণ দেওয়া হলো:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database_name
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect

প্রধান বৈশিষ্ট্য:

  • YAML ফাইলের সিনট্যাক্সটি সহজে পড়ার মতো এবং হায়ারারকিকাল ফরম্যাটে।
  • প্রতিটি সেটিংকে নির্দিষ্ট বিভাগে রাখা যায়, যেমন datasource এবং jpa

DDL-AUTO অপশনের ধরন

Hibernate এর spring.jpa.hibernate.ddl-auto অপশনের কিছু সাধারণ মান:

  • none: কোনো স্কিমা পরিবর্তন করা হবে না।
  • validate: স্কিমা যাচাই করবে, কিন্তু পরিবর্তন করবে না।
  • update: স্কিমা স্বয়ংক্রিয়ভাবে আপডেট করবে।
  • create: নতুন স্কিমা তৈরি করবে।
  • create-drop: অ্যাপ্লিকেশন বন্ধ হলে স্কিমা ড্রপ করবে।

ডায়ালেক্ট (Dialect) নির্বাচন

Hibernate ডায়ালেক্ট ডেটাবেস-নির্ভর। MySQL এর জন্য কিছু সাধারণ ডায়ালেক্ট:

  • MySQL 5: org.hibernate.dialect.MySQL5Dialect
  • MySQL 8: org.hibernate.dialect.MySQL8Dialect

উপরোক্ত কনফিগারেশন অনুযায়ী ডেটাবেস সংযুক্ত করতে পারবেন এবং স্প্রিং ওআরএম (Spring ORM) এর সুবিধা ব্যবহার করতে পারবেন।

Content added By

স্প্রিং ওআরএম (Spring ORM) হলো স্প্রিং ফ্রেমওয়ার্কের একটি মডিউল, যা Java-তে ডাটাবেজ অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। এটি ORM (Object Relational Mapping) টেকনোলজি, যেমন Hibernate, JPA (Java Persistence API) ইত্যাদির সঙ্গে ইন্টিগ্রেশন প্রদান করে। Spring ORM ব্যবহার করে ডাটাবেজ অ্যাকসেস করা অনেক সহজ এবং কার্যকরী হয়, কারণ এটি Boilerplate কোড কমিয়ে আনে।


প্রথম Spring ORM প্রজেক্ট তৈরি: Hello ORM Example

এই সেকশনে, একটি সরল Spring ORM প্রজেক্ট তৈরি করা হবে যেখানে Hibernate ব্যবহার করা হবে।

প্রয়োজনীয় টুলস এবং টেকনোলজি

  • Java Development Kit (JDK): ৮ বা তার বেশি
  • Apache Maven: ডিপেনডেন্সি ম্যানেজমেন্টের জন্য
  • Spring Framework: ৫.৩ বা নতুন
  • Hibernate ORM: ৫.৬ বা নতুন
  • MySQL Database (অথবা আপনার পছন্দমতো ডাটাবেস)

ধাপ ১: Maven প্রজেক্ট তৈরি

প্রথমে একটি Maven প্রজেক্ট তৈরি করুন এবং pom.xml ফাইলে প্রয়োজনীয় ডিপেনডেন্সি যুক্ত করুন।

<dependencies>
    <!-- Spring ORM -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>5.3.29</version>
    </dependency>
    
    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.6.15.Final</version>
    </dependency>
    
    <!-- MySQL Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.34</version>
    </dependency>
    
    <!-- Spring Context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.29</version>
    </dependency>
</dependencies>

ধাপ ২: Hibernate Configuration ফাইল তৈরি

Hibernate এর জন্য hibernate.cfg.xml ফাইল তৈরি করুন এবং ডাটাবেসের তথ্য উল্লেখ করুন।

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">your_password</property>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>

        <!-- Hibernate properties -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>

ধাপ ৩: Entity ক্লাস তৈরি

Hibernate এর জন্য একটি Entity ক্লাস তৈরি করুন। উদাহরণস্বরূপ, Employee ক্লাস নিচে দেওয়া হলো।

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Employee {
    @Id
    private int id;
    private String name;
    private String department;

    // 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 getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }
}

ধাপ ৪: Spring Configuration ফাইল তৈরি

Spring-এর জন্য applicationContext.xml ফাইল তৈরি করুন এবং Hibernate ও Spring ORM-এর জন্য Bean ডিক্লার করুন।

<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 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
        <property name="annotatedClasses">
            <list>
                <value>com.example.Employee</value>
            </list>
        </property>
    </bean>

    <!-- Transaction Manager -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>

ধাপ ৫: DAO এবং Service ক্লাস তৈরি

EmployeeDAO ক্লাসটি Hibernate Session ব্যবহার করে ডাটাবেস অপারেশন সম্পন্ন করবে।

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.transaction.Transactional;

@Repository
public class EmployeeDAO {
    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public void saveEmployee(Employee employee) {
        Session session = sessionFactory.getCurrentSession();
        session.save(employee);
    }
}

ধাপ ৬: Main Class থেকে রান করুন

অবশেষে, Spring Context লোড করে প্রজেক্ট রান করুন।

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        EmployeeDAO employeeDAO = context.getBean(EmployeeDAO.class);

        Employee employee = new Employee();
        employee.setId(1);
        employee.setName("John Doe");
        employee.setDepartment("IT");

        employeeDAO.saveEmployee(employee);
        System.out.println("Employee saved successfully!");
    }
}

এই প্রজেক্টটি রান করলে MySQL ডাটাবেসে Employee টেবিল তৈরি হবে এবং ডাটাবেসে নতুন একটি রেকর্ড যুক্ত হবে।

Content added By
Promotion

Are you sure to start over?

Loading...