হাইবারনেট - ক্যাসকেড সহ একটি সংগ্রহ = "সমস্ত-মুছা-এতিম" এর মালিকানার সত্তার উদাহরণ দ্বারা আর উল্লেখ করা হয়নি


225

আমার সত্তা আপডেট করার চেষ্টা করার সময় আমি নিম্নলিখিত সমস্যাটি নিয়ে আসছি:

"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".

আমার একটি পিতামাতার সত্তা রয়েছে এবং এটিতে Set<...>কয়েকটি সন্তানের সত্ত্বা রয়েছে। আমি যখন এটি আপডেট করার চেষ্টা করি তখন আমি এই সংগ্রহগুলিতে সেট করে সেট করতে সমস্ত রেফারেন্স পাই।

নিম্নলিখিত কোডটি আমার ম্যাপিং উপস্থাপন করে:

@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
    return this.children;
}

আমি কেবল এই <<> সেটটি পরিষ্কার করার চেষ্টা করেছি: সমস্যাটি কীভাবে "সম্ভব" সমাধান করা যায় তবে এটি কার্যকর হয়নি।

যদি আপনার কোন ধারনা আছে, আমাকে দয়া করে।

ধন্যবাদ!


1
@ মেল 3કિંગস, আপনার সরবরাহিত লিঙ্কটি আর সক্রিয় নেই।
ওপাল


উপাদানগুলি সরানোর সময় পরিবর্তনীয় সংগ্রহগুলি ব্যবহার করার চেষ্টা করুন। উদাহরণস্বরূপ something.manyother.remove(other)যদি manyotherহয় তবে ব্যবহার করবেন না List<T>। আরও অনেককে মিউটেবল তৈরি করুন, পছন্দ করুন ArrayList<T>এবং ব্যবহার করুনorphanDelete = true
নুরেটিন

উত্তর:


220

আপনি পুত্রতত্ত্বগুলিতে যে কোনও স্থানে কিছু বরাদ্দ করছেন সে সমস্ত স্থানে পরীক্ষা করুন Check আপনি যে লিঙ্কটি উল্লেখ করেছেন তা একটি নতুন হ্যাশসেট তৈরি করার বিষয়টি সুস্পষ্টভাবে নির্দেশ করে তবে সেটটি পুনরায় স্বাক্ষর করার পরে আপনি যে কোনও সময় এই ত্রুটিটি থাকতে পারেন। উদাহরণ স্বরূপ:

public void setChildren(Set<SonEntity> aSet)
{
    this.sonEntities = aSet; //This will override the set that Hibernate is tracking.
}

সাধারণত আপনি একবার কনস্ট্রাক্টরে সেটটি কেবল "নতুন" করতে চান। যে কোনও সময় আপনি তালিকায় কিছু যুক্ত করতে বা মুছতে চান আপনাকে নতুন তালিকা নির্ধারণের পরিবর্তে তালিকার বিষয়বস্তুগুলি সংশোধন করতে হবে।

বাচ্চাদের যুক্ত করতে:

public void addChild(SonEntity aSon)
{
    this.sonEntities.add(aSon);
}

শিশুদের অপসারণ:

public void removeChild(SonEntity aSon)
{
    this.sonEntities.remove(aSon);
}

8
আসলে, আমার সমস্যাটি আমার সত্তাগুলির সমান এবং হ্যাশকোড সম্পর্কে ছিল। একটি উত্তরাধিকারের কোডটি প্রচুর সমস্যা আনতে পারে, এটি পরীক্ষা করে দেখতে কখনও ভুলবেন না। আমি যা করেছি তা হ'ল মুছে ফেলা এতিম কৌশল এবং সঠিক সমান এবং হ্যাশকোড।
axcdnt

6
আপনি আপনার সমস্যার সমাধান করেছেন বলে আমি আনন্দিত। সমান এবং হ্যাশকোড হাইবারনেটের সাথে আমাকে কয়েকবার কামড় দিয়েছে। "[সলভ]" "দিয়ে প্রশ্নের শিরোনাম আপডেট করার পরিবর্তে আপনার উচিত এবং আপনার উত্তর পোস্ট করুন এবং তারপরে এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করুন mark
ব্রেইনিমাস

ধন্যবাদ, আমি এই জাতীয় কিছুতে দৌড়ে গিয়েছিলাম এবং সেটারটি খালি খালি ছিলাম বলে আমার সেটারটি বের করে দিয়েছিল
সিদ্ধার্থ

হ্যাঁ খালি তালিকায়ও আপনি এই ত্রুটি পান। আমি আশা করব না যেহেতু কোনও অনাথ নেই (তালিকাটি খালি ছিল)।
টিবিআই

4
সাধারণত আপনি একবার কনস্ট্রাক্টরে সেটটি কেবল "নতুন" করতে চান। যে কোনও সময় আপনি তালিকায় কিছু যুক্ত করতে বা মুছতে চান আপনাকে নতুন তালিকা নির্ধারণের পরিবর্তে তালিকার বিষয়বস্তুগুলি সংশোধন করতে হবে। সর্বাধিক প্রভাব
নিখিল সাহু

109

পদ্ধতি:

public void setChildren(Set<SonEntity> aSet) {
    this.sonEntities = aSet;
}

যদি এটি parentEntityআলাদা করা হয় এবং আবার আপডেট করি তবে তা কাজ করে।
তবে সত্তাটি যদি প্রতিটি প্রসঙ্গ থেকে আলাদা না করা হয়, (যেমন অনুসন্ধান এবং আপডেট ক্রিয়াকলাপ একই লেনদেনে রয়েছে) নীচের পদ্ধতিটি কাজ করে।

public void setChildren(Set<SonEntity> aSet) {
    //this.sonEntities = aSet; //This will override the set that Hibernate is tracking.
    this.sonEntities.clear();
    if (aSet != null) {
        this.sonEntities.addAll(aSet);
    }
}

1
@ স্কুল্ড আমারও একই সমস্যা রয়েছে এবং আমি আপনার সমাধানটি প্রয়োগ করেছি (সেটার পদ্ধতিতে আমি বাচ্চাদের সংগ্রহটি পরিষ্কার করছি - this.children.cियर () - এবং আমি নতুন বাচ্চাদের যুক্ত করেছি - this.children.addAll (শিশু))। এই পরিবর্তনটি আমার সমস্যার সমাধান করেনি। আমি এখনও পাই "ক্যাসকেড সহ একটি সংগ্রহ =" সমস্ত-মুছা-অনাথ "এর মালিকানা সত্তার উদাহরণ" ব্যতিক্রম দ্বারা আর উল্লেখ করা হয়নি। আপনার ধারণা আছে কেন? আপনাকে অনেক ধন্যবাদ!
ovdsrn

@ovdsrn দুঃখিত এটি আমার উত্তর নয়, আমি কেবলমাত্র উত্তরটির ফর্ম্যাটটি বাছাই করেছি, মূল লেখক (কিমিমানু) আপনাকে সাহায্য করতে সক্ষম হতে পারে (অথবা আপনি আপনার পরিস্থিতি ভিন্ন হলে নতুন প্রশ্ন শুরু করতে চাইতে পারেন মূল প্রশ্নটি এখানে জিজ্ঞাসা করা হয়েছে) শুভ কামনা
স্কুলড

1
এটি ভালভাবে কাজ করে, তবে এতটা ভাল হয় না যখন বাচ্চারা কোনও নেস্টেড হাইবারনেট উপাদানগুলিতে থাকে এবং উপাদানটি তার সত্তায় নਾਲ করে দেওয়া হয়। তারপরে আপনি একই ত্রুটি পান। এটি কারণ শিশুদের মালিক হ'ল মূল সত্তা এবং সেই উপাদানটি যে শূন্য করা হয় তা নয় ... এই জাতীয় উপাদানটিকে কখনই শূন্য হতে দেওয়া হয় না, বরং এর মধ্যে একটি ধ্বংস () পদ্ধতির দিকে এগিয়ে যাওয়া উচিত শিশু ... কমপক্ষে, আমি এর চেয়ে ভাল সমাধান জানি না ... এটি এক ধরণের সংগ্রহ পরিষ্কার () নির্মাণ তবে তারপরে ধ্বংস () এর মাধ্যমে ...
এডাব্রাস

আরো বিস্তারিত জানার জন্য এই পোস্ট দেখতে উপরের: stackoverflow.com/questions/4770262/...
edbras

7
SonEntities.clear () এর ওপরে this.sonEntities.retainAll (aSet) ব্যবহার করুন কারণ যদি aSet == this.sonEntities (অর্থাত্ একই বস্তু) এটি যুক্ত করার আগে আপনি সেটটি সাফ করবেন!
মার্টিন

33

যখন আমি বিভিন্ন স্থানে পড়েছিলাম যে হাইবারনেট আপনাকে কোনও সংগ্রহের জন্য বরাদ্দ করা পছন্দ করে না, তখন আমি ধরে নিয়েছিলাম যে সবচেয়ে নিরাপদ করার কাজটি অবশ্যই এটি চূড়ান্ত করে দেবে:

class User {
  private final Set<Role> roles = new HashSet<>();

public void setRoles(Set<Role> roles) {
  this.roles.retainAll(roles);
  this.roles.addAll(roles);
}
}

যাইহোক, এটি কার্যকর হয় না, এবং আপনি ভয়ঙ্কর "আর উল্লেখ করা হবে না" ত্রুটি পান যা আসলে এই ক্ষেত্রে যথেষ্ট বিভ্রান্তিকর।

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

সুতরাং আমি এটিতে পরিবর্তন করেছি:

public class User {
  private Set<Role> roles = null;

  public void setRoles(Set<Role> roles) {
  if (this.roles == null) {
    this.roles = roles;
  } else {
    this.roles.retainAll(roles);
   this.roles.addAll(roles);
  }
}
}

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


2
কেন আপনি রক্ষণাবেক্ষণ সব () কল করছেন? কেন অ্যাডএল () এর পরে ক্লিয়ার ()?
এডব্রেস

1
"কেন আপনি ধরে রাখছেন সমস্ত ()? কল কেন? () এর পরে অ্যাডএল () অনুসরণ করবেন না?" ভাল প্রশ্ন, আমি মনে করি যে হাইবারনেট এটি পুনরায় যুক্ত করার আগে আইটেমগুলি সরিয়ে না রাখলে হাইবারনেট এটিকে ডাটাবেস আপডেট হিসাবে দেখার সম্ভাবনা কম বলে আমি মনে করি। তবে আমার সন্দেহ হয় যে এটি কোনওভাবেই কাজ করে না।
xpusostomos

2
আপনার পরিষ্কার () এর ওপরে রক্ষণাবেক্ষণ (সমস্ত) ব্যবহার করা উচিত অন্যথায় আপনি যদি অভিন্ন সেট অবজেক্টে পাস করতে চান তবে আপনি ভূমিকাগুলি মুছতে পারেন। উদাহরণস্বরূপ: ব্যবহারকারীরসেটরোলস (ইউজারআরট্রোলস ()) == ইউজারআরলেসক্লিয়ার ()
মার্টিন

2
আপনি যখন অনাথআরিমোভাল = সত্য সেট করে থাকেন এবং আপনি এই সংগ্রহটি বাতিল বলে একটি রেকর্ড তৈরি করেন, আপনিও এই ত্রুটি পান get সুতরাং: একটিতে অনাথ্রোমোয়াল = সত্য সহ ওয়ানটোমনি বি রয়েছে। যখন আপনি A তৈরি করেন যেখানে বি = নাল হয়, তখন এই সমস্যাটি ট্রিগার হয়ে যায়। শুরু করার এবং এটি চূড়ান্ত করার জন্য আপনার সমাধানটি সেরা বলে মনে হচ্ছে।
লরেন্স

ধন্যবাদ! আমি হিসাবে আমার তালিকা শুরু ছিল List<String> list = new ArrayList<>();List<String> list = null;সমস্যাটি স্থির করে এটিকে পরিবর্তন করা :)
র‌্যাডিক্যাল

19

আসলে, আমার সমস্যাটি আমার সত্তাগুলির সমান এবং হ্যাশকোড সম্পর্কে ছিল। একটি উত্তরাধিকারের কোডটি প্রচুর সমস্যা আনতে পারে, এটি পরীক্ষা করে দেখতে কখনও ভুলবেন না। আমি যা করেছি তা হ'ল মুছে ফেলা এতিম কৌশল এবং সঠিক সমান এবং হ্যাশকোড।


9
দয়া করে, একটি ভালভাবে তৈরি সমান এবং হ্যাশকোড পদ্ধতির উদাহরণ? কারণ আমার প্রচুর সমস্যা রয়েছে: বা আমি আমার সেট আপডেট করতে পারি না বা আমি স্ট্যাকওভারফ্লো ত্রুটি পাই। আমি এখানে একটি প্রশ্ন খুললাম: stackoverflow.com/questions/24737145/… । ধন্যবাদ
স্যাগান দ্য বেস্ট

11

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


নাল পরিবর্তে নতুন অ্যারেলিস্ট প্রেরণ, আমার পক্ষে কাজ করেছে। ধন্যবাদ
rpajaziti

4

সম্পর্ক প্রকার:


সংগ্রহটি ঘোষণা হওয়ার পরে তা ইনস্ট্যান্ট করার চেষ্টা করবেন না hasMany, কেবলমাত্র বস্তুগুলি যুক্ত করুন এবং সরান।

class Parent {
    static hasMany = [childs:Child]
}

রিলেশন টাইপ ব্যবহার করুন:


কিন্তু সংগ্রহটি কেবল তখনই বাতিল হতে পারে যখন সম্পত্তি হিসাবে (ঘোষিত ব্যবহারের) হিসাবে ঘোষণা করা হয় এবং ঘোষণায় আরম্ভ করা হয় না।

class Parent {
    List<Child> childs = []
}

4

আমি ছোট ব্যবহারকারীর সাথে @ ব্যবহারকারী2709454 পদ্ধতির ব্যবহার করেছি।

public class User {
    private Set<Role> roles;

    public void setRoles(Set<Role> roles) {
        if (this.roles == null) {
            this.roles = roles;
        } else if(this.roles != roles) { // not the same instance, in other case we can get ConcurrentModificationException from hibernate AbstractPersistentCollection
            this.roles.clear();
            if(roles != null){
                this.roles.addAll(roles);
            }
        }
    }
}

3

ব্যবহার করার চেষ্টা করার সময় আমার এই সমস্যা হয়েছিল TreeSet। আমি কাজ করে যা oneToManyদিয়ে প্রাথমিককরণ করেছিTreeSet

@OneToMany(mappedBy = "question", fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval=true)
@OrderBy("id")
private Set<WizardAnswer> answers = new TreeSet<WizardAnswer>();

তবে, এটি questionউপরের বর্ণিত ত্রুটিটি নিয়ে আসবে । সুতরাং এটি hibernateসমর্থিত বলে মনে হয় SortedSetএবং যদি কেউ কেবল উপরের লাইনটি পরিবর্তন করে

@OneToMany(mappedBy = "question", fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval=true)
@OrderBy("id")
private SortedSet<WizardAnswer> answers;

এটি যাদুবিদ্যার মতো কাজ করে :) আরও তথ্য এখানেhibernate SortedSet থাকতে পারে


সম্ভবত, একক
সিঙ্গলটন

3

আমি যখন কেবলমাত্র সংগ্রহের সেটারে NULL পাস করার চেষ্টা করি তখনই আমি এই ত্রুটিটি পাই। এটি প্রতিরোধ করতে, আমার সেটটারগুলি দেখতে এরকম দেখাচ্ছে:

public void setSubmittedForms(Set<SubmittedFormEntity> submittedForms) {
    if(submittedForms == null) {
        this.submittedForms.clear();
    }
    else {
        this.submittedForms = submittedForms;
    }
}

3

JSON পোস্ট অনুরোধের সাথে কোনও সত্তা আপডেট করার সময় আমি এতে ছুটে এসেছি। আমি বাচ্চাদের সম্পর্কে ডেটা ছাড়াই সত্তা আপডেট করার সময় ত্রুটি ঘটেছিল, এমনকি যখন কিছুই ছিল না। যোগ করার পদ্ধতি

"children": [],

অনুরোধ বডি সমস্যার সমাধান।


1

অন্য একটি কারণ লম্বোক ব্যবহার করা হতে পারে।

@Builder- Collections.emptyList()আপনি বললেও সংরক্ষণের কারণ হয়.myCollection(new ArrayList());

@Singular- বর্গক্ষেত্র nullহিসাবে ঘোষিত হলেও শ্রেণি স্তরের খেলাপি এবং পাতা ক্ষেত্রকে উপেক্ষা করেmyCollection = new ArrayList()

আমার 2 সেন্ট, একই সাথে 2 ঘন্টা ব্যয় করেছে :)


1

আমি A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instanceসেট করা ছিল যখন আমি পেয়েছিলাম parent.setChildren(new ArrayList<>())। আমি যখন পরিবর্তিত হয়েছি তখন parent.getChildren().clear()এটি সমস্যার সমাধান করেছে।

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


1

আমি স্প্রিং বুট ব্যবহার করছি এবং সরাসরি এটি ওভাররাইট না করা সত্ত্বেও এই সমস্যাটি একটি সংগ্রহের সাথে নিয়েছিলাম, কারণ আমি আরও একটি সীমানা -বান্ধব উপস্থাপনা সরবরাহ করার জন্য কাস্টম সিরিয়াল এবং ডিসরিয়ালাইজারের সাথে একই সংগ্রহের জন্য অতিরিক্ত ক্ষেত্র ঘোষণা করছি the ডেটা:

  public List<Attribute> getAttributes() {
    return attributes;
  }

  public void setAttributes(List<Attribute> attributes) {
    this.attributes = attributes;
  }

  @JsonSerialize(using = AttributeSerializer.class)
  public List<Attribute> getAttributesList() {
    return attributes;
  }

  @JsonDeserialize(using = AttributeDeserializer.class)
  public void setAttributesList(List<Attribute> attributes) {
    this.attributes = attributes;
  }

দেখে মনে হচ্ছে যদিও আমি নিজেই সংগ্রহটি ওভাররাইট করছি না , ডিসরিয়ালাইজেশন এটি এই হুডের নীচে করে, এই সমস্যাটিকে একইভাবে সঞ্চারিত করে। সমাধানটি হ'ল ডিসরিয়ালাইজারের সাথে সম্পর্কিত সেটারটি পরিবর্তন করা যাতে এটি তালিকাটি সাফ করে দেয় এবং ওভাররাইটের পরিবর্তে সমস্ত কিছু যুক্ত করে:

  @JsonDeserialize(using = AttributeDeserializer.class)
  public void setAttributesList(List<Attribute> attributes) {
    this.attributes.clear();
    this.attributes.addAll(attributes);
  }

1

আমার একই সমস্যা ছিল, তবে সেটটি শূন্য করার সময় হয়েছিল। শুধুমাত্র তালিকার কাজ সন্ধানের সেট সংকলনে। আপনি হাইপারনেট টিকা @ লেজি কালেকশন (লাজি ক্লেকশনঅপশন.ফালএসই) জেপিএ টীকা প্রাপ্তি = ফেচটাইপ.এগ্রের অন্তর্নিহিত করতে চেষ্টা করতে পারেন।

আমার সমাধান: এটি আমার কনফিগারেশন এবং ঠিকঠাক কাজ work

@OneToMany(mappedBy = "format", cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
private Set<Barcode> barcodes;

@OneToMany(mappedBy = "format", cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
private List<FormatAdditional> additionals;

1
@OneToMany(mappedBy = 'parent', cascade= CascadeType.ALL, orphanRemoval = true)
List<Child> children = new ArrayList<>();

আমি যখন শিশু অবজেক্টের বিদ্যমান তালিকায় শিশু অবজেক্ট যুক্ত করছিলাম তখন আমি একই ত্রুটিটি অনুভব করেছি।

childService.saveOrUpdate(child);
parent.addToChildren(child);
parentService.saveOrUpdate(parent);

আমার সমস্যার সমাধানের বিষয়টি এতে পরিবর্তিত হচ্ছে:

child = childService.saveOrUpdate(child);

এখন শিশুটি অন্যান্য বিবরণ দিয়েও পুনরজ্জীবিত হয়েছে এবং এটি ভাল কাজ করেছে।


0

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

//Parent class
@OneToMany(mappedBy = 'parent', 
           cascade= CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
List<Child> children = new LinkedList<>()


//Child class
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = 'ParentID', updatable = false)
@JsonBackReference
Parent parent

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


0

নিম্নলিখিত সমাধান আমার জন্য কাজ করে

//Parent class
@OneToMany(mappedBy = 'parent', 
           cascade= CascadeType.ALL, orphanRemoval = true)
@OrderBy(value="ordinal ASC")
List<Child> children = new ArrayList<>()

//Updated setter of children 
public void setChildren(List<Children> children) {
    this.children.addAll(children);
    for (Children child: children)
        child.setParent(this);
}


//Child class
@ManyToOne
@JoinColumn(name="Parent_ID")
private Parent parent;

0

পরিবর্তে নতুন সংগ্রহ বরাদ্দ

public void setChildren(Set<ChildEntity> children) {
    this.children = children;
}

এর সাথে সমস্ত উপাদান প্রতিস্থাপন করুন

public void setChildren(Set<ChildEntity> children) {
    Collections.replaceAll(this.children,children);
}


0

এটি হতে পারে hibernate-enhance-maven-plugin। যখন আমি enableLazyInitializationসম্পত্তি সক্ষম করেছিলাম তখন আমার অলস সংগ্রহের ক্ষেত্রে এই ব্যতিক্রমটি শুরু হয়েছিল। আমি হাইবারনেট 5.2.17 ব্যবহার করছি F ফাইনাল।

হাইবারনেট এই দুটি বিষয় নোট করুন:


0

আমার স্প্রিং বুটের সাথে সম্পূর্ণ আলাদা ছিল! আমার পক্ষে এটি সম্পত্তি সংগ্রহের কারণে হয়নি।

আমার পরীক্ষাগুলিতে আমি একটি সত্তা তৈরি করার চেষ্টা করছিলাম এবং অন্য সংগ্রহের জন্য এই ত্রুটিটি পাচ্ছিলাম যা অব্যবহৃত ছিল!

অনেক চেষ্টা করার পরেও আমি @Transactionalপরীক্ষার পদ্ধতিতে কেবল একটি যুক্ত করেছি এবং এটি এটি সমাধান করেছে। যদিও কোন কারণ নেই।


0

এটি পূর্ববর্তী উত্তরের বিপরীতে, আমার ঠিক একই ত্রুটি ছিল: "ক্যাসকেড সহ একটি সংগ্রহ =" সমস্ত-মুছা-এতিম "আর উল্লেখ করা হয়নি ...." যখন আমার সেটার ফাংশনটি এরকম দেখছিল:

public void setTaxCalculationRules(Set<TaxCalculationRule> taxCalculationRules_) {
    if( this.taxCalculationRules == null ) {
        this.taxCalculationRules = taxCalculationRules_;
    } else {
        this.taxCalculationRules.retainAll(taxCalculationRules_);
        this.taxCalculationRules.addAll(taxCalculationRules_);
    }
}

এবং তখন এটি অদৃশ্য হয়ে গেল যখন আমি এটিকে সাধারণ সংস্করণে পরিবর্তন করেছি:

public void setTaxCalculationRules(Set<TaxCalculationRule> taxCalculationRules_) {
    this.taxCalculationRules = taxCalculationRules_;
}

(হাইবারনেট সংস্করণগুলি - 5.4.10 এবং 4.3.11 উভয়ই চেষ্টা করে the

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