ক্যাসকেডটাইপটির অর্থ কী। একটি @ ম্যানিটোওন জেপিএ সংস্থার জন্য ALL


210

আমি মনে করি একটি @ManyToOneসম্পর্কের প্রসঙ্গে ক্যাসকেডিংয়ের অর্থটি আমি ভুল বুঝেছি ।

মামলা:

public class User {

   @OneToMany(fetch = FetchType.EAGER)
   protected Set<Address> userAddresses;

}

public class Address {

   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   protected User addressOwner;

}

এর অর্থ কী cascade = CascadeType.ALL? উদাহরণস্বরূপ, যদি আমি ডাটাবেস থেকে একটি নির্দিষ্ট ঠিকানা মুছতে পারি, তবে আমি যুক্ত হওয়া সত্যটি cascade = CascadeType.ALLকীভাবে আমার ডেটাগুলিতে প্রভাব ফেলবে ( Userআমি মনে করি)?

উত্তর:


360

এর অর্থ CascadeType.ALLহ'ল অধ্যবসায় সম্পর্কিত সংস্থাগুলিতে সমস্ত EntityManagerক্রিয়াকলাপ ( PERSIST, REMOVE, REFRESH, MERGE, DETACH) চালিয়ে যাবে ( ক্যাসকেড) ।

আপনার ক্ষেত্রে এটি একটি খারাপ ধারণা বলে মনে হচ্ছে, কারণ Addressএটি অপসারণ করলে সম্পর্কিতগুলি সরিয়ে ফেলতে পারে User। ব্যবহারকারীর একাধিক ঠিকানা থাকতে পারে, অন্য ঠিকানাগুলি এতিম হয়ে যাবে। তবে বিপরীতমুখী ক্ষেত্রে ( Userএটিকে বর্ণিত করে ) বোঝা যাবে - যদি ঠিকানাটি কেবলমাত্র একক ব্যবহারকারীর অন্তর্ভুক্ত থাকে তবে এই ব্যবহারকারীর মুছে ফেলা থাকলে ব্যবহারকারীর সমস্ত ঠিকানা মুছে ফেলার প্রচার করা নিরাপদ।

বিটিডাব্লু: আপনি অধ্যবসায় সরবরাহকারীকে সংকেত দিতে mappedBy="addressOwner"আপনার কোনও বৈশিষ্ট্য যুক্ত করতে চাইতে পারেন Userযে যোগদানের কলামটি ADDRESS টেবিলের মধ্যে থাকতে হবে।


55
আমি কখনই এসেছি ম্যাপডবাইয়ের সর্বোত্তম এবং সংক্ষিপ্ত ব্যাখ্যার জন্য +1।
Ridcully

4
ক্যাসকেডটাইপটি রাখা ভাল হতে পারে @এল অ্যানটোমেনির পাশে থাকলেও AL
এমভিএমএন

48

ওপেনজেপিএ ডক্সের উদাহরণের জন্য এখানে দেখুনCascadeType.ALLএর অর্থ এটি সমস্ত ক্রিয়া করবে।

উদ্ধৃতি:

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

ক্যাসকেডটাইপ.আরমোভ: কোনও সত্তা মোছার সময় এটি এই ক্ষেত্রে থাকা সত্তাও মুছে দেয়।

ক্যাসকেডটাইপ.আরফ্রেস: কোনও সত্তাকে রিফ্রেশ করার সময় এই ক্ষেত্রে থাকা সত্তাগুলিও সতেজ করুন।

ক্যাসকেডটাইপ.মারজি: সত্তার স্থিতি মার্জ করার সময়, এই ক্ষেত্রের মধ্যে থাকা সত্ত্বাকেও মার্জ করুন।

সেবাস্টিয়ান


4
জেপিএ-তে নতুন, এই তথ্যটি দরকারী তবে এখানে ডিটাচ সম্পর্কে কী?
সারজ

1
ক্যাসকেডটাইপ.ডেটচ-এ, কোনও সত্তাকে আলাদা করার সময়, তারা প্যারেন্ট সত্তার অধীনে থাকা সত্ত্বাকেও আলাদা করে দেয়।
ডোরিয়ান মেজার

29

যেমনটি আমি এই নিবন্ধে এবং আমার বই, উচ্চ-পারফরম্যান্স জাভা পার্সিস্টনে ব্যাখ্যা করেছি , আপনার ব্যবহার CascadeType.ALLকরা উচিত নয় @ManyToOneযেহেতু সত্তা রাষ্ট্রের রূপান্তরগুলি পিতামাত্ত সত্তা থেকে শিশুদের কাছে প্রচার করা উচিত, অন্যভাবে নয় not

@ManyToOneপাশ সবসময় শিশু সমিতি যেহেতু এটি মানচিত্র অন্তর্নিহিত বিদেশী কী কলাম হয়।

অতএব, আপনি স্থানান্তর করা উচিত CascadeType.ALLথেকে @ManyToOneথেকে সমিতি @OneToManyপাশ, যা ব্যবহার করা উচিত mappedByযেহেতু এটা অ্যাট্রিবিউট সবচেয়ে বেশি কার্যকরী একের সাথে অধিকের টেবিল সম্পর্ক ম্যাপিং


18

EJB3.0 স্পেসিফিকেশন থেকে :

ক্যাসকেড টিকা রোধের উপাদানটি সম্পর্কিত সংস্থাগুলিতে কোনও ক্রিয়াকলাপের প্রভাব প্রচার করতে ব্যবহৃত হতে পারে। ক্যাসকেড কার্যকারিতা সর্বাধিক ব্যবহৃত পিতামাতার এবং শিশু সম্পর্কের ক্ষেত্রে ব্যবহৃত হয়।

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

সুতরাং সংক্ষেপে, সংজ্ঞায়িত সত্তা সম্পর্কগুলি CascadeType.Allনিশ্চিত করবে যে পিতামাতার উপর ঘটে যাওয়া সমস্ত অধ্যবসায়ের ঘটনা যেমন অবিরাম, রিফ্রেশ করে, মার্জ করে এবং সরান, সন্তানের কাছে পৌঁছে দেওয়া হবে। অন্যান্য CascadeTypeবিকল্পগুলি সংজ্ঞায়িত করে বিকাশকারীকে সত্তা সমিতি কীভাবে অধ্যবসায় পরিচালনা করে তার উপর নিয়ন্ত্রণের আরও দানাদার স্তর সরবরাহ করে।

উদাহরণস্বরূপ যদি আমার কাছে কোনও অবজেক্ট বুক থাকে যা পৃষ্ঠাগুলির একটি তালিকা অন্তর্ভুক্ত করে এবং আমি এই তালিকার মধ্যে একটি পৃষ্ঠা অবজেক্ট যুক্ত করি। যদি @OneToManyবুক এবং পৃষ্ঠাটির মধ্যে সংযুক্তি সংজ্ঞায়িত টীকাগুলি চিহ্নিত করা হয় CascadeType.All, তবে বইটি স্থির রাখার ফলে পৃষ্ঠাটি ডাটাবেসেও স্থির থাকবে।


11

জেপিএ ২.০ এ আপনি যদি কোনও ঠিকানা মুছে ফেলতে চান তবে যদি আপনি এটি কোনও ব্যবহারকারীর সত্তা থেকে সরিয়ে থাকেন তবে আপনি নিজের orphanRemoval=trueপরিবর্তে (পরিবর্তে CascadeType.REMOVE) যুক্ত করতে পারেন @OneToMany

মধ্যবর্তী একের ব্যাখ্যা orphanRemoval=trueএবং CascadeType.REMOVEহয় এখানে


4

আপনি যদি কেবল ব্যবহারকারীর জন্য নির্ধারিত ঠিকানাটি মুছতে চান এবং ব্যবহারকারী সত্তা শ্রেণিতে প্রভাব ফেলতে না চান তবে আপনার এমন কিছু চেষ্টা করা উচিত:

@Entity
public class User {
   @OneToMany(mappedBy = "addressOwner", cascade = CascadeType.ALL)
   protected Set<Address> userAddresses = new HashSet<>();
}

@Entity 
public class Addresses {
   @ManyToOne(cascade = CascadeType.REFRESH) @JoinColumn(name = "user_id")
   protected User addressOwner;
}

এইভাবে টিক চিহ্নগুলিতে আনতে আপনার চিন্তা করার দরকার নেই। তবে মনে রাখবেন যখন ব্যবহারকারীকে মুছতে হবে তখন আপনি ব্যবহারকারীর সাথে সংযুক্ত ঠিকানাও মুছে ফেলবেন।

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