سؤال

أحاول حذف عنصر من خريطة التجزئة مع السبات.

هنا هو التكوين على المجموعة:

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@OneToMany(mappedBy = "game", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@Where(clause = "charactType='charact'")
@MapKey(name = "shortcut")
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
public Map<String, Characteristic> getCharacteristics()
{
    return characteristics;
}

public void setCharacteristics(Map<String, Characteristic> characteristics)
{
    this.characteristics = characteristics;
}

وهنا وظيفة إزالة بلدي على نفس الكائن:

@Transactional
public void removeCharacteristic(Characteristic charact)
{
    // getCharacteristics().size();

    getCharacteristics().remove(charact.getShortcut());
}

باستخدام RemoveCharacteristic لا يحذف العنصر في قاعدة البيانات. إذا كنت غير منتظم، فإن الخط للحصول على حجم القائمة (أي حمولة من المجموعة)، يتم حذف السجل جيدا.

ما المشكلة ؟ كيف يمكنني تحقيق ذلك دون إجبار تحميل المجموعة بأكملها؟

تحرير: أنا استبدال الخريطة بأقائمة، ويتم تشغيلها مثل سحر (دون تحميلها في السابق بواسطة وظيفة الحجم () ... هذا غريب للغاية ... لذلك تم حل مشكلتي مع القائمة، لكنني " م فضولي لمعرفة لماذا لا يعمل؟

هل كانت مفيدة؟

المحلول 3

كان هذا خطأ في السبات، وقد تم إصلاح هذا الآن في الإصدار الأحدث

نصائح أخرى

حاول بوضوح إعداد المجموعة. على سبيل المثال

c = getCharacteristics();
c.remove(...);
setCharacteristics(c); 

منذ أن قلت أنه يعمل عند استخدام قائمة بدلا من ذلك، هل من الممكن استخدام وظيفة .remove () بشكل غير صحيح؟

.remove () وظيفة على الخريطة يأخذ مفتاح الكائن تريد إزالة، ليس الكائن الفعلي.

myMap.remove(MyObject.getKey()); //Or however you would get the key

وظائف .remove () قائمة يأخذ الكائن التي تريد إزالتها؛

myList.remove(MyObject); 

يحرر:أرى أنك قلت أنه إذا كنت غير منتظم أن سطر واحد، فإنه يعمل بشكل صحيح، لذلك لا ينطبق هذا على الأرجح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top