জেপিএ ওয়ানটোম্নে বাচ্চা মোছা হচ্ছে না


158

@OneToManyপিতা-মাতার এবং সন্তানের সত্তার মধ্যে একটি সাধারণ ম্যাপিংয়ের সাথে আমার একটি সমস্যা আছে । সমস্ত ভাল কাজ করে, যখন আমি সংগ্রহ থেকে তাদের সরিয়ে ফেলি কেবল তখনকার শিশু রেকর্ডগুলি মুছে ফেলা হয় না।

পিতামাতা:

@Entity
public class Parent {
    @Id
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
    private Set<Child> childs = new HashSet<Child>();

 ...
}

শিশু:

@Entity
public class Child {
    @Id
    @Column(name = "ID")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="PARENTID", nullable = false)
    private Parent parent;

  ...
}

আমি যদি এখন শিশুদের সেট থেকে বাচ্চাটিকে মুছুন তবে এটি ডেটাবেস থেকে মুছে ফেলা হবে না। আমি child.parentরেফারেন্স বাতিল করার চেষ্টা করেছি , কিন্তু এটিও কার্যকর হয়নি।

সত্তাগুলি একটি ওয়েব অ্যাপ্লিকেশনটিতে ব্যবহৃত হয়, মুছাটি একটি অ্যাজাক্স অনুরোধের অংশ হিসাবে ঘটে। সেভ বোতামটি চাপলে আমার মুছে ফেলা শিশুদের একটি তালিকা নেই, তাই আমি এগুলি স্পষ্টভাবে মুছতে পারি না।

উত্তর:


253

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

অংশ হিসাবে এটি হ'ল জেপিএ আসলে জানে না যে এটি সংগ্রহ থেকে সরানো কিছু মুছতে পারে কিনা। বস্তু মডেলিংয়ের পদগুলিতে, এটি রচনা এবং "সমষ্টি * * এর মধ্যে পার্থক্য ।

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

সমষ্টি একটি আলগা ধরণের সমিতি এবং কোর্স এবং শিক্ষার্থী দ্বারা টাইপ করা হয়। কোর্স মুছুন এবং ছাত্র এখনও বিদ্যমান (সম্ভবত অন্যান্য কোর্সে)।

সুতরাং আপনাকে এই আচরণটি বাধ্য করার জন্য বিক্রেতার সাথে নির্দিষ্ট এক্সটেনশনগুলি ব্যবহার করতে হবে (যদি উপলভ্য থাকে) বা স্পষ্টভাবে শিশুটিকে মুছুন এবং পিতামাতার সংগ্রহ থেকে এটিকে সরিয়ে দিন।

আমি সচেতন:


ধন্যবাদ সুন্দর ব্যাখ্যা। আমি যেমন ভয় পেয়েছিলাম তেমন (আমি জিজ্ঞাসা করার আগে আমি কিছু অনুসন্ধান / পঠন করেছি, কেবল সংরক্ষণ হতে চাই)। একরকমভাবে আমি জেপিএ এপিআই এবং হাইবারনেটকে সরাসরি নিট করার সিদ্ধান্তের জন্য আফসোস করতে শুরু করি .. আমি চন্দ্র পাটনি পয়েন্টারটি চেষ্টা করব এবং হাইবারনেট মুছুন_অরফ্যান ক্যাসকেড প্রকারটি ব্যবহার করব।
বার্ট

আমি এই সম্পর্কে একই ধরণের প্রশ্ন আছে। দয়া করে দয়া করে এই পোস্টটি একবার দেখুন দয়া করে? stackoverflow.com/questions/4569857/…
থাং ফাম

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

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

সংমিশ্রণ এবং সংগ্রহের মধ্যে পার্থক্য প্রকাশ করে সুন্দরভাবে ব্যাখ্যা করা হয়েছে!
ফিলিপ লিওও

73

ক্লিটাসের উত্তর ছাড়াও, ২০১০ সালের ডিসেম্বর থেকে জেপিএ ২.০ , চূড়ান্ত , টীকাতে একটি orphanRemovalবৈশিষ্ট্যের পরিচয় দেয় @OneToMany। আরও তথ্যের জন্য এই ব্লগ এন্ট্রি দেখুন

নোট করুন যেহেতু অনুমানটি তুলনামূলকভাবে নতুন, সমস্ত জেপিএ 1 সরবরাহকারীর চূড়ান্ত জেপিএ 2 বাস্তবায়ন নেই। উদাহরণস্বরূপ, হাইবারনেট ৩.০.০-বিটা -২ প্রকাশটি এখনও এই বৈশিষ্ট্যটিকে সমর্থন করে না।


ব্লগ এন্ট্রি - লিঙ্ক নষ্ট হয়ে গেছে।
স্টেফি

1
এবং ওয়েবব্যাক মেশিনের যাদুটি আমাদের বাঁচায়: web.archive.org/web/20120225040254/http://javablog.co.uk/2009/…
লুই জ্যাকমেট

43

আপনি এটি চেষ্টা করতে পারেন:

@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)


2
ধন্যবাদ। তবে প্রশ্নটি জেপিএ থেকে ১ বার ফিরে এসেছে। এবং এই বিকল্পটি আর ফিরে পাওয়া যায় নি।
বার্ট

9
তবুও জেনে রাখা ভাল, আমরা যারা JPA2 বারের জন্য এর সমাধান অনুসন্ধান করি তাদের জন্য :)
alex440

20

যেমনটি ব্যাখ্যা করা হয়েছে, আমি জেপিএর সাথে যা করতে চাই তা করা সম্ভব নয়, তাই আমি হাইবারনেট.ক্যাসকেড টীকাটি ব্যবহার করেছি, এটির সাথে, প্যারেন্ট ক্লাসে প্রাসঙ্গিক কোডটি এখন এর মতো দেখাচ্ছে:

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "parent")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
            org.hibernate.annotations.CascadeType.DELETE,
            org.hibernate.annotations.CascadeType.MERGE,
            org.hibernate.annotations.CascadeType.PERSIST,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<Child> childs = new HashSet<Child>();

আমি 'সব' সাধারণ ব্যবহার করতে পারি না কারণ এটি পিতামাতাকেও মুছে ফেলত।


4

এখানে অপসারণের প্রসঙ্গে ক্যাসকেডের অর্থ হ'ল আপনি পিতামাতাকে সরিয়ে দিলে বাচ্চাদের সরিয়ে দেওয়া হবে। সমিতি নয়। আপনি যদি হাইপারনেটটিকে আপনার জেপিএ সরবরাহকারী হিসাবে ব্যবহার করেন তবে আপনি হাইবারনেট নির্দিষ্ট ক্যাসকেড ব্যবহার করে এটি করতে পারেন ।



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