Discriminator Column ব্যবহার করে Inheritance Mapping করা

Inheritance Mapping Techniques - এন হাইবারনেট (NHibernate) - Microsoft Technologies

348

NHibernate-এ Inheritance Mapping ব্যবহারের জন্য বিভিন্ন পদ্ধতি রয়েছে, যার মধ্যে Discriminator Column একটি জনপ্রিয় পদ্ধতি। এটি Single Table Inheritance (STI) মডেল অনুসরণ করে, যেখানে সব সাবক্লাসের ডেটা একটি মাত্র টেবিলে সঞ্চিত হয়, এবং Discriminator Column ব্যবহার করে প্রতিটি রেকর্ডের প্রকারভেদ করা হয়।

Discriminator Column কী?

Discriminator Column একটি বিশেষ কলাম যা নির্দেশ করে যে কোন সাবে সাবক্লাসটি একটি নির্দিষ্ট রেকর্ডের সাথে সম্পর্কিত। এটি মূল ক্লাস এবং তার সাবক্লাসের মধ্যে পার্থক্য করতে সাহায্য করে, যখন ডেটাবেসে সবগুলো ক্লাসের ডেটা একসাথে থাকে।


1. Inheritance Mapping এর জন্য Discriminator ব্যবহার করা

এখানে, আমরা একটি উদাহরণ দেখাবো যেখানে একটি Employee ক্লাসের দুটি সাবক্লাস Manager এবং Developer রয়েছে। আমরা Single Table Inheritance পদ্ধতি ব্যবহার করে এগুলোর ডেটা একটি টেবিলে সঞ্চয় করব এবং Discriminator Column এর মাধ্যমে সাবক্লাসের পার্থক্য করব।

ক্লাস গঠন

প্রথমে একটি মূল Employee ক্লাস তৈরি করব এবং তারপরে দুইটি সাবক্লাস তৈরি করব: Manager এবং Developer

public class Employee
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

public class Manager : Employee
{
    public virtual string Department { get; set; }
}

public class Developer : Employee
{
    public virtual string ProgrammingLanguage { get; set; }
}

2. hibernate.cfg.xml কনফিগারেশন ফাইল সেটআপ

এখন, hibernate.cfg.xml ফাইলে Inheritance Mapping কনফিগার করব, যাতে Discriminator Column ব্যবহৃত হয়।

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <!-- ডেটাবেস কানেকশন প্রপার্টি -->
    <property name="hibernate.connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="hibernate.connection.connection_string">Server=yourserver;Database=yourdb;Integrated Security=True;</property>
    <property name="hibernate.dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>

    <!-- Inheritance Mapping এর জন্য Discriminator Column ব্যবহার -->
    <mapping class="YourNamespace.Employee, YourAssembly"/>
    <mapping class="YourNamespace.Manager, YourAssembly"/>
    <mapping class="YourNamespace.Developer, YourAssembly"/>
  </session-factory>
</hibernate-configuration>

এখানে, Employee, Manager, এবং Developer ক্লাসগুলোকে hibernate.cfg.xml ফাইলে উল্লেখ করা হয়েছে।


3. Entity Mapping (Hbm ফাইল)

এখন, Employee, Manager, এবং Developer ক্লাসের জন্য হাইবারনেট mapping ফাইল তৈরি করব। আমরা Discriminator Column কনফিগার করব যাতে সাবক্লাসের ডেটা পৃথকভাবে চিহ্নিত হয়।

Employee.hbm.xml

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Employee" table="Employee">
    <id name="Id" column="Id">
      <generator class="identity"/>
    </id>
    <property name="Name" column="Name"/>
    
    <!-- Discriminator Column কনফিগার -->
    <discriminator column="Discriminator" type="string"/>
  </class>
</hibernate-mapping>

Manager.hbm.xml

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <subclass name="Manager" extends="Employee">
    <property name="Department" column="Department"/>
  </subclass>
</hibernate-mapping>

Developer.hbm.xml

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <subclass name="Developer" extends="Employee">
    <property name="ProgrammingLanguage" column="ProgrammingLanguage"/>
  </subclass>
</hibernate-mapping>

এখানে, Employee ক্লাসের জন্য একটি Discriminator কলাম সেট করা হয়েছে, যা Manager এবং Developer ক্লাসের মধ্যে পার্থক্য করবে। Discriminator কলামটি ডেটাবেস টেবিলে Discriminator নামে থাকবে এবং তার মান হিসেবে Manager অথবা Developer থাকবে, যা নির্দেশ করবে যে কোন সাবক্লাসের রেকর্ডটি।


4. Database Schema

ডেটাবেসে Employee টেবিলটি কিছুটা এমন দেখতে হবে:

CREATE TABLE Employee (
    Id INT PRIMARY KEY IDENTITY,
    Name VARCHAR(255),
    Discriminator VARCHAR(50),
    Department VARCHAR(255),  -- Manager জন্য
    ProgrammingLanguage VARCHAR(255)  -- Developer জন্য
);

এখানে, Discriminator কলামটি Manager অথবা Developer সাবক্লাসের নির্দেশক হিসেবে কাজ করবে। আর Department এবং ProgrammingLanguage কলামগুলো শুধুমাত্র সংশ্লিষ্ট সাবক্লাসের জন্য থাকবে।


5. Entity Save এবং Retrieve করা

এখন, আমরা Session ব্যবহার করে Employee, Manager, এবং Developer Entity সেভ এবং রিট্রিভ করতে পারি।

Entity Save করা:

using NHibernate;

public class EmployeeService
{
    public void SaveEmployee()
    {
        using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                var manager = new Manager { Name = "Alice", Department = "HR" };
                var developer = new Developer { Name = "Bob", ProgrammingLanguage = "C#" };

                session.Save(manager);
                session.Save(developer);

                transaction.Commit();
            }
        }
    }
}

Entity Retrieve করা:

public void RetrieveEmployees()
{
    using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
    {
        var employees = session.CreateQuery("from Employee").List<Employee>();

        foreach (var employee in employees)
        {
            Console.WriteLine($"Employee: {employee.Name}");

            if (employee is Manager manager)
            {
                Console.WriteLine($"Department: {manager.Department}");
            }
            else if (employee is Developer developer)
            {
                Console.WriteLine($"Programming Language: {developer.ProgrammingLanguage}");
            }
        }
    }
}

সারাংশ

  • Discriminator Column ব্যবহার করে Single Table Inheritance পদ্ধতিতে Inheritance Mapping করা হয়।
  • Discriminator কলামটি সাবক্লাসগুলোর মধ্যে পার্থক্য স্থাপন করে, এবং ডেটাবেসে একটি মাত্র টেবিলেই সব সাবক্লাসের ডেটা রাখা হয়।
  • Session ব্যবহার করে Entity সেভ ও রিট্রিভ করার সময় NHibernate স্বয়ংক্রিয়ভাবে Discriminator কলাম ব্যবহার করে সঠিক সাবক্লাস চিহ্নিত করে।

এভাবে, Discriminator Column ব্যবহার করে Inheritance Mapping করতে পারবেন NHibernate-এ।

Content added By
Promotion

Are you sure to start over?

Loading...