বর্ণনা

আগের পাঠে, আপনি দেখেছেন যে হাইবারনেট একটি বিশেষ DTYPE VARCHAR কলাম ব্যবহার করে একটি Entity ক্লাসের নাম সংরক্ষণ করে। এই ধরনের একটি কলাম একটি বৈষম্যকারী বলা হয় . এটি ডাটাবেসের একটি প্রদত্ত সারির জন্য কোন ক্লাস তৈরি করতে হবে তা দ্ব্যর্থহীনভাবে নির্ধারণ করতে ব্যবহৃত হয়।

আপনি @DiscriminatorColumn টীকা দিয়ে এই কলামটি ম্যানিপুলেট করতে পারেন । উদাহরণ:

@DiscriminatorColumn(name="column_name",   discriminatorType = DiscriminatorType.INTEGER)

JPA স্পেসিফিকেশন অনুসারে, একজন বৈষম্যকারীর নিম্নলিখিত প্রকার থাকতে পারে:

  • STRING
  • CHAR
  • পূর্ণসংখ্যা

যাইহোক, হাইবারনেট আপনাকে এই তালিকাটি কিছুটা প্রসারিত করতে দেয়। এটি এই ধরনের জাভা সমর্থন করে: স্ট্রিং, চার, int, বাইট, শর্ট, বুলিয়ান।

আমরা যদি INTEGEER টাইপ ব্যবহার করি, তাহলে এতে Entity ক্লাসের নাম কিভাবে এনকোড করব? এর জন্য, আরেকটি টীকা ব্যবহার করা হয় - @DiscriminatorValue

একটি উদাহরণ দেখুন:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
@DiscriminatorValue("1")
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@DiscriminatorValue("2")
class Client extends User {
   String address;
}

উপরের উদাহরণে, আমরা হাইবারনেটকে বলেছি যে বৈষম্যকারী user_type কলাম ব্যবহার করবে, যা সংখ্যা সংরক্ষণ করবে। যদি এটি মান 1 সঞ্চয় করে, তাহলে এর মানে হল যে সারি টাইপ হল Employee, যদি 2 সংরক্ষণ করা হয়, তাহলে সারি টাইপ হল ক্লায়েন্ট। সহজ এবং সুন্দর.

@DiscriminatorValue

কিন্তু এখানেই শেষ নয়. আপনি হাইবারনেটকে বলতে পারেন কিভাবে একটি স্ট্রিং এর ধরন ব্যাখ্যা করতে হয় যখন এর বৈষম্যকারী NULL হয়।

এটা আসলে খুব সহজ. আপনি @DiscriminatorValue টীকাটির জন্য নাল মান নির্দিষ্ট করুন । উদাহরণস্বরূপ, এই মত:

@DiscriminatorValue("null")

ক্লাস উদাহরণ:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("null")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}

আমরা হাইবারনেটকে বলেছি যে user_type কলামে NULL আছে এমন যেকোন টেবিল সারিটিকে User টাইপের অবজেক্ট হিসেবে ব্যাখ্যা করা উচিত।

কিন্তু এখানেই শেষ নয়. @DiscriminatorValue টীকাটির জন্য আরেকটি আকর্ষণীয় মান রয়েছে।

এই হল:

@DiscriminatorValue("not null")

ক্লাস উদাহরণ:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("not null")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}

এই টীকা দিয়ে, আমরা হাইবারনেটকে বলেছিলাম যে user_type কলামে একটি নন-NULL মান সহ যেকোন টেবিল সারিকে User-এর টাইপ অবজেক্ট হিসাবে ব্যাখ্যা করা উচিত। কিন্তু এটি শুধুমাত্র সেই ক্ষেত্রেই যদি এমন কোনো শ্রেণী পাওয়া না যায় যার প্রয়োজনীয় নম্বরটি স্পষ্টভাবে উল্লেখ করা আছে।

বৈষম্যকারীদের বিভিন্ন মূল্যবোধের জন্য এটি কীভাবে কাজ করবে:

  • 0 - ব্যবহারকারী টাইপের একটি বস্তু তৈরি করুন
  • 1 - টাইপ কর্মচারী একটি বস্তু তৈরি করুন
  • 2 - ক্লায়েন্ট টাইপের একটি বস্তু তৈরি করুন
  • 3 - ব্যবহারকারী টাইপের একটি বস্তু তৈরি করুন
  • 4 - ব্যবহারকারী টাইপের একটি বস্তু তৈরি করুন

@Discriminator ফর্মুলা

কিন্তু এখানেই শেষ নয়. আমাদের বৈষম্যকারীর জন্য, আমরা একটি পূর্ণসংখ্যা সূত্র নির্দিষ্ট করতে পারি যার দ্বারা এটি @DiscriminatorValue টীকাটির মানগুলি গণনা করবে ।

এর জন্য একটি বিশেষ টীকা আছে, এটিকে @DiscriminatorFormula বলা হয় ।

উদাহরণ:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorFormula("case when ‘join’ is not null then 1 else 2 end")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
@DiscriminatorValue("1")
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@DiscriminatorValue("2")
class Client extends User {
   String address;
}

@DiscriminatorFormula দ্বারা প্রত্যাবর্তিত মানগুলিকে @DiscriminatorValue টীকাতে উল্লেখ করা মানগুলির সাথে হাইবারনেট দ্বারা তুলনা করা হবে । এটি দিয়ে, আপনি বেশ জটিল পরিস্থিতি লিখতে পারেন:

@DiscriminatorFormula(
           	"case when address is not null " +
           	"then 'Client' " +
           	"else (" +
           	"   case when occupation is not null " +
           	"   then 'Employee' " +
           	"   else 'Unknown' " +
           	"   end) " +
           	"end "
)