জেপিএ ক্যাসকেডটাইপ.এল সব অনাথদের মুছে না


132

নিম্নলিখিত ম্যাপিংয়ের সাহায্যে জেপিএ ব্যবহার করে অনাথ নোডগুলি মুছতে আমার সমস্যা হচ্ছে

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;

আমি অনাথদের ভূমিকাটি ডাটাবেসের আশেপাশে ঝুলিয়ে দিচ্ছি।

আমি টীকা org.hibernate.annotations.Cascadeহাইবারনেট নির্দিষ্ট ট্যাব ব্যবহার করতে পারি তবে স্পষ্টতই আমি আমার সমাধানটিকে হাইবারনেট বাস্তবায়নে বাঁধাতে চাই না।

সম্পাদনা : দেখে মনে হচ্ছে জেপিএ 2.0 এটির জন্য সমর্থন অন্তর্ভুক্ত করবে।

উত্তর:


164

আপনি যদি এটি হাইবারনেটের সাথে ব্যবহার করে থাকেন তবে আপনাকে স্পষ্টভাবে টীকাটি সংজ্ঞায়িত CascadeType.DELETE_ORPHANকরতে হবে, যা জেপিএর সাথে একত্রে ব্যবহার করা যেতে পারে CascadeType.ALL।

আপনি যদি হাইবারনেট ব্যবহার করার পরিকল্পনা না করেন তবে আপনাকে প্রথমে প্রথমে শিশু উপাদানগুলি মুছতে হবে এবং তারপরে কোনও অনাথ রেকর্ড এড়াতে প্রধান রেকর্ডটি মুছতে হবে।

সম্পাদন ক্রম

  1. মুছে ফেলার জন্য মূল সারিটি আনুন
  2. শিশু উপাদান আনুন
  3. সমস্ত শিশু উপাদান মুছুন
  4. প্রধান সারি মুছুন
  5. সেশন বন্ধ

জেপিএ ২.০ এর সাহায্যে আপনি এখন অনাথআরমোভাল = সত্য ব্যবহার করতে পারেন

@OneToMany(mappedBy="foo", orphanRemoval=true)

3
ধন্যবাদ আমি এই পথে যেতে শেষ করেছি, আমি মনে করি এটি জেপিএ অনুমানের জন্য কিছুটা ওভারসাইট।
— পল হিলান

13
JPA 2.0 মান এখন আপনি সর্বশেষ ব্যবহার করে থাকেন @OneToMany একটি অ্যাট্রিবিউট হিসাবে deleteOrphan হয়েছে হাইবারনেট আপনি @OneToMany কি করতে পারেন (..., deleteOrphan সত্য =)
— jomohke

যখন আমি কেবল শিশু-উপাদানগুলি আপডেট করি তখন মৃত্যুদন্ডের ক্রম কী হয়? এতিম-রেকর্ড মুছে ফেলা হবে?
— jAckOdE

113

আপনি যদি জেপিএ ২.০ ব্যবহার করছেন, আপনি এখন অনাথগুলি সরানোর orphanRemoval=trueজন্য @xxxToManyটীকাটির বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

প্রকৃতপক্ষে, CascadeType.DELETE_ORPHAN3.5.5-ফাইনালে অবচয় করা হয়েছে।


6
আসলে আমি মনে করি যে অনাথ রিমোভাল = সত্য অর্থ অন্য কিছু, অর্থাত্ যখন আমি কোনও পিতা-মাতার সংগ্রহ থেকে এটি অপসারণ করি তখন তা মুছুন। ডাউনলোড.
— আর্চি

দয়া করে আর্চির লিঙ্কটি দিয়ে যান।
— জিগার শাহ

4
orphanRemoval = সত্য কাজ করে না। এটি পুরানো উপায়ে করতে হবে।
— জো অলমোর

45
╔═════════════╦═════════════════════╦═════════════════════╗
║   Action    ║  orphanRemoval=true ║   CascadeType.ALL   ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   delete    ║     deletes parent  ║    deletes parent   ║
║   parent    ║     and orphans     ║    and orphans      ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   change    ║                     ║                     ║
║  children   ║   deletes orphans   ║      nothing        ║
║    list     ║                     ║                     ║
╚═════════════╩═════════════════════╩═════════════════════╝

1
আমার যদি থাকে cascade = CascadeType.ALL, orphanRemoval = falseএবং পিতামাতাকে মুছলে কী হয় ? এটি কি শিশুদের মুছে ফেলবে, যদিও আমি বিশেষভাবে না বলা করেছি?
— izogfif

12

আপনি যদি এলিপ্লেলিংকের সাথে জেপিএ ব্যবহার করে থাকেন তবে আপনাকে @ প্রাইভেটওয়েড টিকাটি সেট করতে হবে ।

ডকুমেন্টেশন: এক্সিলিপ উইকি - এক্সপ্লিটলিংক জেপিএ এক্সটেনশনগুলি ব্যবহার করে - অধ্যায় 1.4 @ কীভাবে ব্যক্তিগতকৃত এনটোটেশন ব্যবহার করবেন?


7

আপনি অনাথগুলি মুছে ফেলার জন্য @ প্রাইভেটওউন্ড ব্যবহার করতে পারেন যেমন

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;

5
ধন্যবাদ @ ত্রিশমা এটি লক্ষ্য করা উচিত @ প্রাইভেটওউন্ড হ'ল একটি এক্সপ্রেসিংক জেপিএ এক্সটেনশন।
— পল হিলান

5

আমি কেবল এই সমাধানটি খুঁজেছি তবে আমার ক্ষেত্রে এটি কার্যকর হয় না:

@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = সত্যের কোনও প্রভাব নেই।


1
পরিবর্তনটি কার্যকর হওয়ার আগে আমার পরিষ্কার ও নির্মাণ করা দরকার।
— মারালবজো

বাহ, আমি কেন আমার ম্যান্টিটোনে ক্যাসকেডটাইপ.এলএল যুক্ত করা ক্যাসকেডিং মোছা ছিল না তা সম্পর্কে এক ঘন্টা সন্ধান করছিলাম। পরিষ্কার এবং নির্মিত এবং এটি কাজ করে। ধন্যবাদ @ মরালবজো।
— অ্যান্ড্রু মাইরোজ


2

আমারও একই সমস্যা ছিল এবং আমি ভাবছিলাম যে নীচে এই অবস্থাটি এতিমদের মুছে ফেলেনি। হাইজারনেট (5.0.3. ফাইনাল) - এ যখন আমি একটি নাম মুছে ফেলা কোয়েরি সম্পাদন করলাম তখন থালা খাবারের তালিকাটি মুছে ফেলা হয়নি:

@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();

তারপরে আমি মনে রেখেছিলাম যে আমি অবশ্যই নামকরণ মুছে ফেলা কোয়েরিটি ব্যবহার করব না , তবে সত্ত্বা ম্যানেজার। EntityManager.find(...)সত্তা আনতে এবং তারপরে EntityManager.remove(...)এটি মুছতে আমি যেমন পদ্ধতিটি ব্যবহার করেছি, তেমনি থালা বাসনও মুছে ফেলা হয়েছে।


2

শুধু @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)।

টার্গেটএন্টিটি = MyClass.class সরান , এটি দুর্দান্ত কাজ করে।



0

আমি এক থেকে এক ম্যাপিং ব্যবহার করছিলাম, তবে শিশু মোছা হচ্ছে না জেপিএ বৈদেশিক কী লঙ্ঘন করছে

অনাথআরমোভাল = সত্য ব্যবহার করার পরে, সমস্যার সমাধান হয়েছে


@ ওনটোইন (ক্যাসকেড = ক্যাসকেডটাইপ.এল, অনাথ রিমোভাল = সত্য) @ জয়নকালাম (নাম = "শিশু_ওআইডি") বেসরকারী শিশু শিশু;
— বিপিন চৌহান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.