6.1 গভীর নির্ভরতা ব্যবস্থাপনা

এবং @OneToMany টীকা এবং এর মতো আরও কিছু দরকারী এবং আকর্ষণীয় জিনিস । তাদের সকলের 4টি সাধারণভাবে ব্যবহৃত বিকল্প রয়েছে:

  • cascade = CascadeType.ALL
  • orphanRemoval = সত্য
  • fetch = FetchType.LAZY

এখন আমরা তাদের আরও বিশদে বিশ্লেষণ করব। এবং আমরা সবচেয়ে আকর্ষণীয় - ক্যাসকেড টাইপ দিয়ে শুরু করব । এই প্যারামিটারটি নির্ধারণ করে যে আমরা প্রধান সত্তা পরিবর্তন করলে নির্ভরশীল সত্তার কী ঘটবে।

এই প্যারামিটারের জন্য JPA স্পেসিফিকেশনের নিম্নলিখিত মান রয়েছে:

  • সমস্ত
  • টিকে থাকুন
  • একত্রিত করা
  • অপসারণ
  • রিফ্রেশ
  • বিচ্ছিন্ন করুন

যাইহোক, হাইবারনেট এই স্পেসিফিকেশনটিকে আরও তিনটি বিকল্পে প্রসারিত করে:

  • প্রতিলিপি
  • SAVE_UPDATE
  • তালা

অবশ্যই, ডাটাবেস এবং তাদের কনস্ট্রানিসের সাথে একটি শক্তিশালী সমান্তরাল রয়েছে। যাইহোক, এছাড়াও পার্থক্য আছে. হাইবারনেট যতটা সম্ভব ডাটাবেসের সাথে আসল কাজটি লুকানোর চেষ্টা করে, তাই এই হাইবারনেট ক্যাসকেডগুলি ঠিক সত্তা বস্তু সম্পর্কে।

6.2 ক্যাসকেড টাইপ

ক্যাসকেড প্যারামিটার বর্ণনা করে যে নির্ভরশীল বস্তুর কী ঘটবে যদি আমরা তাদের অভিভাবক (মাস্টার অবজেক্ট) পরিবর্তন করি। প্রায়শই, এই প্যারামিটারটি অ্যানোটেশনগুলির সাথে একসাথে ব্যবহার করা হয় যা অবজেক্ট নির্ভরতা বর্ণনা করে:

উদাহরণ:

OneToOne(cascade = CascadeType.ALL)

অথবা এই মত:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

এটি একটি পৃথক টীকা হিসাবেও লেখা যেতে পারে:

@Cascade({ org.hibernate.annotations.CascadeType.ALL })

এখন এই টীকা মানে কি সম্পর্কে আরো কথা বলা যাক.

6.3 সমস্ত, অবিরত, একত্রিত করুন

CascadeType.ALLএর মানে হল যে সমস্ত ক্রিয়া যা আমরা প্যারেন্ট অবজেক্টের সাথে সঞ্চালিত করি তার নির্ভরশীল বস্তুর জন্য পুনরাবৃত্তি করতে হবে।

CascadeType.PERSISTমানে আমরা যদি প্যারেন্ট অবজেক্টকে ডাটাবেসে সেভ করি, তাহলে তার নির্ভরশীল অবজেক্টের সাথেও একই কাজ করতে হবে। উদাহরণ:


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

এই শ্রেণীর সাথে কাজ করার একটি উদাহরণ:


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
 
session.persist(director);
session.flush();

আমরা শুধুমাত্র Employee ধরনের একটি অবজেক্ট সংরক্ষণ করি, এর নির্ভরশীল বস্তু EmployeeTask স্বয়ংক্রিয়ভাবে ডাটাবেসে সংরক্ষিত হবে।

CascadeType.MERGEএর মানে হল যে আমরা যদি ডাটাবেসে প্যারেন্ট অবজেক্ট আপডেট করি, তাহলে তার নির্ভরশীল অবজেক্টের সাথেও একই কাজ করতে হবে।

6.4 সরান, মুছুন, বিচ্ছিন্ন করুন

CascadeType.REMOVEএর মানে হল যে যদি আমরা ডাটাবেসের মধ্যে একটি প্যারেন্ট অবজেক্ট মুছে ফেলি, তাহলে তার নির্ভরশীল বস্তুর সাথে একই কাজ করা আবশ্যক।

CascadeType.DELETEএকই মানে। এগুলো প্রতিশব্দ। শুধু বিভিন্ন স্পেসিফিকেশন থেকে.

CascadeType.DETACHএর মানে হল যে যদি আমরা সেশন থেকে প্যারেন্ট অবজেক্টটি সরিয়ে ফেলি, তাহলে তার নির্ভরশীল বস্তুর সাথেও একই কাজ করা উচিত। উদাহরণ:


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

এই শ্রেণীর সাথে কাজ করার একটি উদাহরণ:


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
director.task = task;
session.flush();
 
assertThat(session.contains(director)).isTrue();
assertThat(session.contains(task)).isTrue();
 
session.detach(director);
 
assertThat(session.contains(director)).isFalse();
assertThat(session.contains(task)).isFalse();

CascadeType.REFRESHএবং CascadeType.SAVE_UPDATEআমরা যেভাবে আশা করি সেভাবে কাজ করি - তারা প্যারেন্ট অবজেক্টের সাথে তার নির্ভরশীল বস্তুর সাথে সঞ্চালিত ক্রিয়াগুলিকে নকল করে।

6.5 এতিম অপসারণের বিকল্প

এছাড়াও কখনও কখনও আপনি প্যারামিটার জুড়ে আসতে পারে orphan. এতিম অপসারণের জন্য এটি সংক্ষিপ্ত। এটি নিশ্চিত করতে ব্যবহৃত হয় যে পিতামাতার সত্তা ছাড়া কোনও শিশু সত্তা নেই।

OneToOne(orphan = true)

যদি এই প্যারামিটারটি সত্য হিসাবে সেট করা থাকে, তাহলে শিশু সত্তাটি অদৃশ্য হয়ে গেলে মুছে ফেলা হবেসমস্ত লিঙ্ক. এটা ঠিক একই রকম নয় Cascade.REMOVE

আপনার এমন পরিস্থিতি হতে পারে যেখানে একাধিক অভিভাবক সত্তা একটি সন্তানকে উল্লেখ করে। তারপরে এটি উপকারী যে এটি মূল সত্তা মুছে ফেলার সাথে মুছে ফেলা হয় না, তবে শুধুমাত্র যদি এটির সমস্ত উল্লেখ বাতিল করা হয়।

ধরা যাক আপনার একটি ক্লাস আছে:


@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToMany(cascade = CascadeType.ALL, orphan = true)
   @JoinColumn(name = "employee_id")
   private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}


Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.tasks.get(0);
director.tasks.remove(task)
session.persist(director);
session.flush();

EmployeeTask অবজেক্টটি মুছে ফেলা হবে কারণ এতে কোন রেফারেন্স অবশিষ্ট নেই। একই সময়ে, কেউ মূল বস্তুটি মুছে ফেলেনি।

6.6 আনার বিকল্প

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

  • FetchType.LAZY
  • FetchType.EAGER

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