CodeGym /কোর্স /SQL & Hibernate /@একের পর এক

@একের পর এক

SQL & Hibernate
লেভেল 13 , পাঠ 4
বিদ্যমান

5.1 এক থেকে এক যোগাযোগের বিভিন্ন ফর্ম

দুটি সত্তা শ্রেণীর মধ্যে সম্পর্কের আরেকটি আকর্ষণীয় এবং বরং নির্দিষ্ট ক্ষেত্রে রয়েছে - একটি এক-এক সম্পর্ক।

আমি এই কেসটিকে খুব নির্দিষ্ট বলি, কারণ এটি ডাটাবেসের চেয়ে জাভা অবজেক্ট সম্পর্কে বেশি। ডাটাবেসে, টেবিলের মধ্যে সম্পর্কের জন্য শুধুমাত্র দুটি বিকল্প রয়েছে:

  • টেবিলের সারিতে অন্য টেবিলের আইডির একটি লিঙ্ক রয়েছে।
  • পরিষেবা টেবিলটি বহু-থেকে-অনেক সম্পর্কের জন্য ব্যবহৃত হয়।

এন্টিটি ক্লাসের ক্ষেত্রে, এমন বিকল্প থাকতে পারে যা বিভিন্ন টীকা দ্বারা বর্ণনা করা হয়েছে:

  • @এম্বেডেড
  • একতরফা OneToOne
  • দ্বিপাক্ষিক OneToOne
  • @MapsId

নীচে আমরা তাদের মধ্যে সবচেয়ে জনপ্রিয় বিবেচনা করব।

5.2 এমবেডেড

যাইহোক, আমরা ইতিমধ্যেই সবচেয়ে সহজ এক-থেকে-এক@Embedded যোগাযোগের বিকল্পটি বিবেচনা করেছি - এটি একটি টীকা । এই ক্ষেত্রে, আমাদের ডাটাবেসে একই টেবিলে দুটি ক্লাস সংরক্ষিত আছে।

ধরা যাক আমরা UserAddress ক্লাসে ব্যবহারকারীর ঠিকানা সংরক্ষণ করতে চাই :


@Embeddable
class UserAddress {
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
}

তারপরে আমাদের এই ঠিকানাটির সাথে একটি ক্ষেত্র যুক্ত করতে হবে User ক্লাসে :


@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;
 
   @Embedded
   public UserAddress address;
 
   @Column(name="created_date")
   public Date createdDate;
}

হাইবারনেট বাকি কাজ করবে: ডেটা একটি টেবিলে সংরক্ষণ করা হবে, কিন্তু HQL প্রশ্নগুলি লেখার সময়, আপনাকে ক্লাস ক্ষেত্রগুলিতে কাজ করতে হবে।

HQL ক্যোয়ারী উদাহরণ:

select from User where address.city = 'Paris'

5.3 একতরফা OneToOne

এখন পরিস্থিতি কল্পনা করুন: আমাদের কাছে একটি উত্স টেবিল কর্মচারী এবং একটি টাস্ক রয়েছে যা কর্মচারীকে বোঝায়। কিন্তু আমরা নিশ্চিতভাবে জানি যে একজন ব্যবহারকারীকে সর্বাধিক একটি টাস্ক বরাদ্দ করা যেতে পারে। তারপরে আমরা এই পরিস্থিতি বর্ণনা করতে টীকা ব্যবহার করতে পারি @OneToOne

উদাহরণ:


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

হাইবারনেট নিশ্চিত করবে যে শুধুমাত্র একটি টাস্কে একজন ব্যবহারকারী নেই, তবে একজন ব্যবহারকারীর শুধুমাত্র একটি টাস্ক রয়েছে। অন্যথায়, এই কেসটি কার্যত এর থেকে আলাদা নয় @ManyToOne

5.4 দ্বিপাক্ষিক OneToOne

পূর্ববর্তী বিকল্পটি একটু অসুবিধাজনক হতে পারে, কারণ প্রায়শই আপনি একজন কর্মচারীকে শুধুমাত্র একটি কাজের জন্যই অর্পণ করতে চান না, তবে একজন কর্মচারীকে একটি কাজও বরাদ্দ করতে চান।

এটি করার জন্য, আপনি EmployeeTask ক্ষেত্রটি Employee ক্লাসে যোগ করতে পারেন এবং এটিকে সঠিক টীকা দিতে পারেন।


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToOne(cascade = CascadeType.ALL, mappedBy="employee")
   private EmployeeTask task;
}

গুরুত্বপূর্ণ !কর্মচারী টেবিলে টাস্ক_আইডি ক্ষেত্র নেই , পরিবর্তে টাস্ক টেবিলের কর্মচারী_আইডি ক্ষেত্রটি টেবিলের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয় ।

বস্তুর মধ্যে একটি সংযোগ স্থাপন এই মত দেখায়:


Employee director = session.find(Employee.class, 4);
EmployeeTask task = session.find(EmployeeTask.class, 101);
task.employee = director;
director.task = task;
 
session.update(task);
session.flush();

লিঙ্কটি অপসারণ করতে, উভয় বস্তু থেকে লিঙ্কগুলিও মুছে ফেলতে হবে:


Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.task;
 
task.employee = null;
session.update(task);
 
director.task = null;
session.update(director);
 
session.flush();

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