5.1 বর্ণনা

এবং পরিশেষে, শেষ কৌশল হল ক্লাস প্রতি টেবিল। এর অর্থ হল প্রতিটি ক্লাসের জন্য একটি পৃথক টেবিল ব্যবহার করা হবে। এক অর্থে, এটি একই MappedSuperClass, শুধুমাত্র একটি আপডেট আকারে।

প্রথমত, আপনাকে একটি টীকা ব্যবহার করতে হবে:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

এই টীকা সহ ক্লাসগুলি এইরকম দেখাবে:


@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Entity
class User {
	int id;
	String name;
	LocalDate birthday;
}

@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}

@Entity
class Client extends User {
	String address;
}

এবং প্রতিটি ক্লাসের জন্য আলাদা টেবিল। উদাহরণস্বরূপ, এইগুলি:


CREATE TABLE user {
	id INT,
	name VARCHAR,
	birthday DATE
}

CREATE TABLE employee {
	id INT,
	name VARCHAR,
	birthday DATE,
	occupation VARCHAR,
	salary INT,
	join DATE
}

CREATE TABLE client {
	id INT,
	name VARCHAR,
	birthday DATE,
	address VARCHAR
}

প্রধান পার্থক্য হল একটি পাস-থ্রু আইডি (প্রাথমিক কী) সমস্ত টেবিলের জন্য ব্যবহার করা হয়। আপনি একই আইডি সহ বিভিন্ন সারি থাকতে পারবেন না, শুধুমাত্র একই টেবিলের মধ্যেই নয়, টেবিলের এই গ্রুপের মধ্যেও। হাইবারনেট এই যত্ন নেবে.

5.2 উদাহরণ

এটা কিভাবে কাজ করে তা দেখতে খুব আকর্ষণীয়.

আপনি সমস্ত ব্যবহারকারীদের পেতে একটি সাধারণ HQL প্রশ্ন লিখতে পারেন: ব্যবহারকারী, কর্মচারী, ক্লায়েন্ট :

List<User> accounts = session.createQuery("from User").list();

কিন্তু হাইবারনেট, পরিবর্তে, একটি খুব আকর্ষণীয় প্রশ্ন তৈরি করবে। এটি সমস্ত টেবিল থেকে একটি নির্বাচন করবে, তারপর এটিকে UNION ALL-এর মাধ্যমে এক ধরনের ভার্চুয়াল টেবিলে একত্রিত করবে, এবং শুধুমাত্র তখনই এটি অনুসন্ধান করবে এবং/অথবা নির্বাচন করবে

কিন্তু বিভিন্ন কলামের সাথে সারণিগুলিকে একত্রিত করার জন্য, প্রথমে সেগুলিকে নকল কলামগুলির সাথে সম্পূরক করতে হবে৷ উদাহরণস্বরূপ, ব্যবহারকারীর টেবিলটিকে কলামগুলির সাথে সম্পূরক করা দরকার:

  • occupation VARCHAR
  • salary INT
  • join DATE
  • address VARCHAR

এক্সিকিউশনের আগে ইউজার টেবিলে এসকিউএল কোয়েরির একটি উদাহরণ UNION ALL:


SELECT   id,
         name,
         birthday,
         CAST(NULL AS VARCHAR) AS occupation,
         CAST(NULL AS INT) AS salary,
         CAST(NULL AS DATE) AS join,
         CAST(NULL AS VARCHAR) AS address,
         0 AS clazz
FROM  user

এক্সিকিউশনের আগে কর্মচারী টেবিলে একটি উদাহরণ SQL ক্যোয়ারী UNION ALL:


SELECT   id,
         name,
         birthday,
         occupation,
         salary,
         join,
         CAST(NULL AS VARCHAR) AS address,
         1 AS clazz
FROM  employee

এক্সিকিউশনের আগে ক্লায়েন্ট টেবিলে এসকিউএল কোয়েরির একটি উদাহরণ UNION ALL:


SELECT  id,
        name,
        birthday,
        CAST(NULL AS VARCHAR) AS occupation,
        CAST(NULL AS INT) AS salary,
        CAST(NULL AS DATE) AS join,
        address,
        2 AS clazz
FROM client

ভাল খবর হল যে HQL প্রশ্নগুলি আপনি যেভাবে চান সেভাবে কাজ করবে।

খারাপ খবর হল যে টেবিলে প্রচুর ডেটা থাকলে তারা ধীর হতে পারে। কারণ প্রথমে আপনাকে সমস্ত টেবিল থেকে ডেটা নির্বাচন করতে হবে, তারপরে তাদের সারিগুলিকে UNION ALL, এবং শুধুমাত্র তারপর ফিল্টার করতে হবে।