জেপিএ-তে ক্যাসকেডটাইপ.আরমোভ এবং এতিম রিমোভালের মধ্যে পার্থক্য কী?


107

এর মধ্যে পার্থক্য কী

@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }

এবং

@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }

এই উদাহরণটি জাভা ইই টিউটোরিয়াল থেকে এসেছে, তবে আমি এখনও বিশদটি বুঝতে পারি না।


এতিম অপসারণের অর্থ হ'ল যখন তাদের "পিতামাতার" সত্তার সাথে সম্পর্ক নষ্ট হয়ে যায় তখন নির্ভরশীল সত্তাগুলি সরানো হয়।
রাহুল ত্রিপাঠি

4
একটি পরীক্ষার কেস লিখেছিলেন যা ধারণাটি চিত্রিত করতে পারে।
মার্টিন অ্যান্ডারসন

উত্তর:


155

থেকে এখানে : -

ক্যাসকেডিং সরান

ক্যাসকেডটাইপ.আরমোভ (বা ক্যাসকেডটাইপ.এলএল, যার মধ্যে রিমোভ অন্তর্ভুক্ত) দিয়ে একটি রেফারেন্স ফিল্ড চিহ্নিত করা ইঙ্গিত দেয় যে অপসারণ অপারেশনগুলি সেই ক্ষেত্রটি দ্বারা রেফারেন্সযুক্ত সত্তা বস্তুগুলিতে স্বয়ংক্রিয়ভাবে ক্যাসকেড হওয়া উচিত (একাধিক সত্তা অবজেক্টগুলি সংগ্রহের ক্ষেত্রের দ্বারা রেফারেন্স করা যেতে পারে):

@Entity
class Employee {
     :
    @OneToOne(cascade=CascadeType.REMOVE)
    private Address address;
     :
}

এতিম অপসারণ

জেপিএ 2 একটি অতিরিক্ত এবং আরও আক্রমণাত্মক অপসারণ ক্যাসকেডিং মোডকে সমর্থন করে যা @ ওনেটওউন এবং @ ওনটোমোনে টীকাগুলির অনাথ সরানোর উপাদানটি ব্যবহার করে নির্দিষ্ট করা যেতে পারে:

@Entity
class Employee {
     :
    @OneToOne(orphanRemoval=true)
    private Address address;
     :
}

বিভিন্নতা: -

দুটি সেটিংসের মধ্যে পার্থক্য একটি সম্পর্ক বিচ্ছিন্ন করার প্রতিক্রিয়াতে। উদাহরণস্বরূপ, যেমন অ্যাড্রেস ফিল্ডটি নালায় সেট করার সময় বা অন্য কোনও অ্যাড্রেস অবজেক্টে।

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

90

CascadeType.REMOVEএবং এর মধ্যে পার্থক্য বোঝার একটি সহজ উপায় orphanRemoval=true

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

ক্যাসকেড অপসারণের জন্য: আপনি যদি আবেদন করেন setOrders(null)তবে সম্পর্কিত Orderসংস্থাগুলি স্বয়ংক্রিয়ভাবে ডিবিতে সরানো হবে না


4
সরান === মোছা
আব্দুল

11

মনে করুন আমাদের একটি শিশু সত্তা এবং একটি পিতামাতার সত্তা। একজন পিতামাতার বেশ কয়েকটি সন্তান থাকতে পারে।

@Entity
class parent {
  //id and other fields
 @OneToMany (orphanRemoval = "true",cascade = CascadeType.REMOVE)
   Set<Person> myChildern;
}

অরফ্রামমোভাল একটি ওআরএম ধারণা, এটি শিশু অনাথ কিনা তা জানায়। এটি ডাটাবেস থেকেও সরানো উচিত।

একটি শিশু অনাথ হয় যখন এটি তার পিতামাতার কাছ থেকে অ্যাক্সেস করা যায় না। উদাহরণস্বরূপ, যদি আমরা ব্যক্তি অবজেক্টস সেটটি সরিয়ে ফেলে (এটি একটি খালি সেটটিতে সেট করে) বা এটি একটি নতুন সেট দিয়ে প্রতিস্থাপন করি তবে পিতামাতারা আর পুরানো সেটে বাচ্চাদের অ্যাক্সেস করতে পারবেন না এবং শিশুরা এতিম হয় তাই বাচ্চাগুলি নষ্ট হয়ে যায় ডাটাবেসেও সরানো হয়েছে।

ক্যাসকেডটাইপ.আরমোভ একটি ডাটাবেস স্তর ধারণা এবং এটি বলে যে পিতামাতার অপসারণ করা হয়েছে কিনা, সন্তানের টেবিলে সম্পর্কিত সমস্ত রেকর্ডগুলি সরানো উচিত।


এই উত্তরটি আরও যুক্তিযুক্ত বলে মনে হচ্ছে, তারপরে এই থ্রেডে অন্য কোনও উত্তর।
জিগনেশ এম খাতরী

2

কার্যত পার্থক্যটি আপনি ডেটা (PATCH) আপডেট করার চেষ্টা করছেন বা সম্পূর্ণভাবে ডেটা (PUT) প্রতিস্থাপন করার চেষ্টা করছেন কিনা তার মধ্যে রয়েছে lies

আসুন আমরা আপনাকে customerব্যবহারকারীর চেয়ে মুছা মুছুন তা cascade=REMOVEসেই গ্রাহকদের অর্ডারগুলিও সরিয়ে দেবে যা উদ্দেশ্যে এবং কার্যকর বলে মনে হচ্ছে।

@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }

এখন ধরা যাক আপনি এটির customerসাথে আপডেট করুন orphanRemoval="true"এটি পূর্ববর্তী সমস্ত আদেশ মুছে ফেলবে এবং সরবরাহিত সরবরাহের সাথে সেগুলি প্রতিস্থাপন করবে। ( PUTশর্তাবলী REST API)

@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }

orphanRemovalপুরানো আদেশ ছাড়া রাখা হবে। ( PATCHশর্তাবলী REST API)


1

যেহেতু এই প্রশ্নটি খুব সাধারণ, এই উত্তরটি আমার ব্লগে আমার লেখা নিবন্ধের উপর ভিত্তি করে ।

ক্যাসকেডটাইপ। পুনরুদ্ধার করুন

CascadeType.REMOVEকৌশল, যা আপনি স্পষ্টভাবে কনফিগার করতে পারেন:

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();

বা CascadeType.ALLকৌশল থেকে স্পষ্টতই উত্তরাধিকারী :

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();

আপনাকে removeঅভিভাবক সত্তা থেকে তার শিশু সত্তায় অপারেশন প্রচার করতে দেয় allows

সুতরাং, আমরা যদি সংগ্রহের সাথে প্যারেন্ট Postসত্তাটি আনা করি commentsএবং postসত্তাটি সরিয়ে ফেলি:

Post post = entityManager.createQuery("""
    select p
    from Post p
    join fetch p.comments
    where p.id = :id
    """, Post.class)
.setParameter("id", postId)
.getSingleResult();

entityManager.remove(post);

হাইবারনেট তিনটি মুছে ফেলা বিবৃতি কার্যকর করতে চলেছে:

DELETE FROM post_comment 
WHERE id = 2

DELETE FROM post_comment 
WHERE id = 3

DELETE FROM post 
WHERE id = 1

PostCommentশিশু সত্ত্বা কারণে মোছা হয়েছে CascadeType.REMOVEকৌশল, যা আমরা যদি সন্তান সত্ত্বা হিসাবে ভাল মুছে অভিনয় করেন।

এতিম সরানোর কৌশল

এতিম-অপসারণ কৌশলটি, যা বিশিষ্টতার মাধ্যমে সেট করা দরকার orphanRemoval:

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.ALL,
    orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();

সংগ্রহ থেকে শিশু সত্তা অপসারণ করার পরে আপনাকে চাইল্ড টেবিল সারি সরানোর অনুমতি দেয়।

সুতরাং, আমরা যদি Postসত্ত্বাকে এর commentsসংগ্রহের সাথে লোড করি এবং সংগ্রহ PostCommentথেকে প্রথমটি সরিয়ে commentsফেলি:

Post post = entityManager.createQuery("""
    select p
    from Post p
    join fetch p.comments c
    where p.id = :id
    order by p.id, c.id
    """, Post.class)
.setParameter("id", postId)
.getSingleResult();

post.remove(post.getComments().get(0));

হাইবারনেট সম্পর্কিত post_commentটেবিল সারিটির জন্য একটি মোছা বিবৃতি কার্যকর করতে চলেছে :

DELETE FROM post_comment 
WHERE id = 2

এই বিষয় সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটিও পরীক্ষা করে দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.