Question

Je tente de supprimer un élément d'une carte de hachage avec mise en veille prolongée.

Voici ma config sur la collection:

@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;
}

et voici ma fonction de suppression sur le même objet:

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

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

Utilisation de la removeCharacteristic ne supprime pas l'élément dans la base de données. Si je décommentez la ligne pour obtenir la taille de la liste (qui charge la force de la collection), l'enregistrement est bien supprimé.

Quel est le problème? comment puis-je parvenir sans forcer la charge de la collection?

EDIT: Je remplacerai la carte par une liste, et il fonctionne comme un charme (sans le charger au préalable par la fonction size ()) ... Ceci est très étrange ... Donc, mon problème est résolu avec la liste, mais je suis curieux de savoir pourquoi il ne fonctionne pas?

Était-ce utile?

La solution 3

Ce fut un bug de mise en veille prolongée, ceci est maintenant corrigé dans la version plus récente

Autres conseils

Essayez de régler explicitement la collection. par exemple.

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

Puisque vous avez dit que cela fonctionne lorsque vous utilisez une liste à la place, est-il possible que vous utilisez correctement la fonction .remove () de la carte?

La fonction .remove () sur une carte prend la clé de l'objet que vous souhaitez supprimer, pas l'objet réel .

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

La fonction .remove () d'une liste prend l'objet que vous souhaitez supprimer;

myList.remove(MyObject); 

Edit: Je vois que vous avez dit que si vous supprimez cette ligne, cela fonctionne correctement, donc cela ne très probablement pas applicable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top