বর্ণনা

একটি শ্রেণী শ্রেণিবিন্যাস সংরক্ষণের পরবর্তী পদ্ধতি হল একটি একক টেবিলে শ্রেণিবিন্যাসের সমস্ত শ্রেণী সংরক্ষণ করা । এই কৌশলটিকে বলা হয় একক টেবিল

উদাহরণস্বরূপ, এই মত:

CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

অর্থাৎ, আমাদের একটি টেবিল রয়েছে, যেখানে আমাদের শ্রেণিবিন্যাসের সমস্ত শ্রেণীর কলামগুলি বিভিন্ন রঙ দিয়ে চিহ্নিত করা হয়েছে। এছাড়াও একটি বিশেষ পরিষেবা কলাম DTYPE VARCHAR রয়েছে , যেখানে হাইবারনেট এন্টিটি ক্লাসের নাম সংরক্ষণ করবে।

কেবলমাত্র হাইবারনেটকে ব্যাখ্যা করা বাকি আছে যে এন্টিটি ক্লাসের ডেটা এখন একটি টেবিলে ডাটাবেসে সংরক্ষণ করা হয়েছে। এটি @Inheritance টীকা ব্যবহার করে করা যেতে পারে :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

আমাদের ক্লাসের একটি উদাহরণ:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@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;
}

কিভাবে ডেটা সংরক্ষণ করা হয়

এখন আসুন একটি উদাহরণ লিখি যেখানে আমরা আমাদের কয়েকটি সত্তা তৈরি করি এবং সেগুলিকে ডাটাবেসে সংরক্ষণ করি:

Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);

Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);

ডাটাবেসে সংরক্ষণ করার সময়, নিম্নলিখিত SQL ক্যোয়ারী কার্যকর করা হবে:

INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')

INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')

একটি টেবিলে ডেটা সংরক্ষণ করার সময়, হাইবারনেট শুধুমাত্র পরিচিত সত্তা ক্ষেত্রগুলিকে পাস করে। এর মানে হল যে অনির্দিষ্ট কলামগুলি NULL হবে।

এবং এর মানে হল যে আপনি অকুপেশন কলামের জন্য NOT NULL টাইপ নির্দিষ্ট করতে পারবেন না, যেহেতু একজন ক্লায়েন্ট যখন একই টেবিলে সংরক্ষিত থাকে, তখন তার পেশা NULL হবে। এটি একই টেবিলে বিভিন্ন সত্তা সংরক্ষণ করার অসুবিধাগুলির মধ্যে একটি।

এসকিউএল কোয়েরির শেষ ক্ষেত্রটি হল DTYPE কলাম, যেটিতে Entity ক্লাসের নাম রয়েছে। আপনি যখন আপনার টেবিল থেকে ডেটা পড়তে চান তখন এটি হাইবারনেট দ্বারা ব্যবহৃত হয়।

উদাহরণ:

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

এই ক্যোয়ারী ডাটাবেসে সংরক্ষিত সমস্ত ব্যবহারকারী-টাইপ অবজেক্টের একটি তালিকা ফিরিয়ে দেবে: ব্যবহারকারী, কর্মচারী এবং ক্লায়েন্ট। DTYPE কলামের উপর ভিত্তি করে, সত্তার ধরন সঠিকভাবে নির্ধারণ করা হবে এবং সঠিক শ্রেণীর একটি বস্তু তৈরি করা হবে।

আমাদের ক্ষেত্রে, অ্যাকাউন্টের তালিকায় দুটি বস্তু থাকবে: একটি কর্মচারীর ধরন এবং একটি ক্লায়েন্টের প্রকার।

HQL নিয়ম।