@ManyToOne

All lectures for BN purposes
লেভেল 1 , পাঠ 844
বিদ্যমান

2.1 টেবিল স্তরে লিঙ্ক করা

আমরা দেখেছি কিভাবে হাইবারনেট অক্জিলিয়ারী টেবিলে সংগ্রহ সঞ্চয় করে। এখন বাস্তব সত্তা ক্লাস সঞ্চয় করে এমন পূর্ণাঙ্গ টেবিলের মধ্যে সম্পর্ক কিভাবে সংগঠিত করা যায় তা বের করা যাক।

হাইবারনেটে এন্টিটি ক্লাসের মধ্যে চার ধরনের সম্পর্ক রয়েছে:

  • এক থেকে এক
  • এক থেকে অনেক
  • অনেক থেকে এক
  • অনেক - থেকে - অনেক

এবং আমরা সবচেয়ে সহজ বিকল্পটি দিয়ে বিশ্লেষণ শুরু করব - অনেক - থেকে- এক

আপনি ইতিমধ্যে এসকিউএল-এ টেবিলের মধ্যে এই ধরনের একটি সম্পর্ক জুড়ে এসেছেন। এটি সাধারণত কেমন দেখায় তা এখানে:

আইডি নাম পেশা বেতন বয়স তারিখ যোগ দিতে
1 ইভানভ ইভান প্রোগ্রামার 100000 25 2012-06-30
2 পেট্রোভ পেট্র প্রোগ্রামার 80000 23 2013-08-12
3 ইভানভ সের্গেই পরীক্ষক 40000 ত্রিশ 2014-01-01
4 রাবিনোভিচ মইশা পরিচালক 200000 35 2015-05-12
5 কিরিয়েনকো আনাস্তাসিয়া অফিস ব্যবস্থাপক 40000 25 2015-10-10
6 ভাস্কা বিড়াল 1000 3 2018-11-11

কর্মচারী টেবিল:

এই টেবিলে নিম্নলিখিত কলাম আছে:

  • আইডি আইএনটি
  • নাম VARCHAR
  • পেশা VARCHAR
  • বেতন INT
  • বয়স INT
  • join_date DATE

এবং এইভাবে টাস্ক টেবিল , যা কর্মীদের জন্য কাজ ধারণ করে, এর মতো দেখায়:

আইডি কর্মচারী আইডি নাম শেষ তারিখ
1 1 ফ্রন্টএন্ডে একটি বাগ ঠিক করুন 2022-06-01
2 2 ব্যাকএন্ডে একটি বাগ ঠিক করুন 2022-06-15
3 5 কফি কিনুন 2022-07-01
4 5 কফি কিনুন 2022-08-01
5 5 কফি কিনুন 2022-09-01
6 (খালি) অফিস পরিষ্কার করুন (খালি)
7 4 জীবন উপভোগ করুন (খালি)
8 6 জীবন উপভোগ করুন (খালি)

এই টেবিলে মাত্র 4টি কলাম রয়েছে:

  • আইডি - অনন্য টাস্ক নম্বর (এবং টেবিলের সারি);
  • কর্মচারী_আইডি - কর্মচারী টেবিল থেকে কর্মচারী আইডি যেখানে কাজটি বরাদ্দ করা হয়েছে;
  • নাম - নাম এবং কাজের বিবরণ;
  • সময়সীমা - যে সময়টি কাজটি শেষ করতে হবে।

আমরা দেখছি যে টাস্ক টেবিলের অনেক সারি কর্মচারী টেবিলের একটি একক এন্ট্রি উল্লেখ করতে পারে। এই ধরনের ছক-স্তরের সম্পর্ককে বলা হয় বহু- একজন।

2.2 জাভা ক্লাস লেভেলের সাথে সম্পর্ক

টেবিল স্তরে যোগাযোগের পাশাপাশি, আপনি হাইবারনেটে সত্তা ক্লাসের স্তরেও যোগাযোগের ব্যবস্থা করতে পারেন। এটি একটি টীকা দিয়ে করা হয় @ManyToOne

তবে প্রথমে, আসুন দুটি শ্রেণী তৈরি করি: কর্মচারী এবং কর্মচারী টাস্ক :


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String name;
 
   @Column(name="occupation")
   public String occupation;
 
   @Column(name="salary")
   public Integer salary;
 
   @Column(name="join_date")
   public Date join;
}

এবং কর্মচারীর কাজ সঞ্চয় করার জন্য একটি দ্বিতীয় শ্রেণি:


@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String description;
 
  @Column(name="employee_id")
   public Integer employeeId;
 
   @Column(name="deadline")
   public Date deadline;
}

এই ক্লাসগুলির সাথে সবকিছু ঠিক আছে, কিন্তু তাদের মধ্যে এমন কোন সম্পর্ক নেই যা এই সত্যকে প্রতিফলিত করবে যে EmployeeTask ক্লাসের কর্মচারী আইডি ক্ষেত্রটি কর্মচারী শ্রেণীর আইডি ক্ষেত্রকে বোঝায়। এটা ঠিক করার সময়

2.3 @ManyToOne টীকা।

প্রথমত, জাভাতে আমরা তাদের আইডির পরিবর্তে অবজেক্ট (এবং অবজেক্ট রেফারেন্স) তে কাজ করতে অভ্যস্ত। তাই প্রথমত, EmployeeTask ক্লাসে employeeId ক্ষেত্রের পরিবর্তে, আসুন শুধু Employee টাইপের একটি বস্তুর দিকে নির্দেশ করি। আমাদের নতুন ক্লাস দেখতে কেমন হবে তা এখানে:


@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String description;
 
   @ManyToOne
   @JoinColumn(name = "employee_id")
   public Employee employee;
 
   @Column(name="deadline")
   public Date deadline;
}

টীকাটির সাহায্যে @ManyToOne, আমরা ইঙ্গিত করেছি যে অনেক EmployeeTask অবজেক্ট Employee প্রকারের একটি অবজেক্টকে উল্লেখ করতে পারে। এছাড়াও, টীকা @JoinColumn ব্যবহার করে , আমরা নির্দেশ করেছি আমাদের টেবিলের কোন কলামে কর্মচারী অবজেক্টের আইডি সংরক্ষণ করা হয়েছে।

2.4 উদাহরণের অনুরোধ করুন

এবং এখন আসুন কিছু উদাহরণ দেখাই কিভাবে হাইবারনেট এই ধরনের সম্পর্কিত ক্লাসের সাথে কাজ করতে পারে।

দৃশ্যকল্প এক

একটি নির্দিষ্ট ব্যবহারকারীর জন্য নির্ধারিত সমস্ত কাজ খুঁজে বের করার জন্য একটি প্রশ্ন লিখুন। এই প্রশ্নটি HQL এ কেমন দেখাবে তা এখানে:

from EmployeeTask where employee.name = "Ivan Ivanovich"

আপনি কেবল একটি বিন্দুর মাধ্যমে নির্ভরশীল শ্রেণীর ক্ষেত্রগুলি উল্লেখ করতে পারেন। এটা খুবই আরামদায়ক। তবে আসুন এখনও এই প্রশ্নটি জাভা কোড আকারে লিখি:


String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

দৃশ্যকল্প দুই

আসুন একটি প্রশ্ন লিখি যা কর্মচারীদের একটি তালিকা প্রদান করে যাদের অতিরিক্ত কাজ আছে। একটি টাস্ক ওভারডিউ যদি এর সময়সীমা অতীতে থাকে। এসকিউএল-এ সেই প্রশ্নটি দেখতে কেমন হবে তা এখানে:


SELECT DISTINCT employee.*
FROM task JOIN employee ON task.employee_id = employee.id
WHERE task.deadline < CURDATE();

DISTINCTব্যবহার করা হয় কারণ একজন ব্যবহারকারীকে অনেকগুলি কাজ বরাদ্দ করা যেতে পারে।

এবং এখন HQL এ একই প্রশ্ন লিখি:

select distinct employee from EmployeeTask where deadline < CURDATE();

এই প্রশ্নের মধ্যে কর্মচারী হল EmployeeTask শ্রেণীর একটি ক্ষেত্র

পরিস্থিতি তিন

সমস্ত অনির্ধারিত কাজগুলি পরিচালককে বরাদ্দ করুন। SQL ক্যোয়ারী এই মত দেখাবে:


UPDATE task SET employee_id = 4 WHERE employee_id IS NULL

এবং এখন HQL এ একই প্রশ্ন লিখি:

update EmployeeTask set employee = :user where employee is null

শেষ প্রশ্নটি সবচেয়ে কঠিন। আমাদের পরিচালকের আইডি পাস করতে হবে, কিন্তু EmployeeTask ক্লাসে এমন একটি ক্ষেত্র নেই যেখানে আমরা একটি আইডি লিখতে পারি, পরিবর্তে এটিতে একটি কর্মচারী ক্ষেত্র রয়েছে যেখানে আমাদের কর্মচারী টাইপের একটি বস্তুর একটি রেফারেন্স বরাদ্দ করতে হবে।


Employee director = session.get(Employee.class, 4);
 
String hql = "update EmployeeTask set employee = :user where employee is null";
Query<EmployeeTask> query = session.createQuery(hql, EmployeeTask.class);
query.setParameter("user", director);
query.executeUpdate();

মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION