2009-12-14 3 views
2

J'essaie de supprimer un élément d'une carte de hachage avec mise en veille prolongée.Comment puis-je supprimer un élément d'une Hashmap dans Hibernate?

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écommente la ligne pour obtenir la taille de la liste (qui force le chargement de la collection), l'enregistrement est bien supprimé.

Quel est le problème? comment puis-je y parvenir sans forcer la charge de toute la collection? Je remplace la carte par une liste, et il fonctionne comme un charme (sans le charger auparavant par la fonction size()) ... C'est très étrange ... Donc mon problème est résolu avec le liste, mais je suis curieux de savoir pourquoi il ne fonctionne pas?

+0

Votre transaction est bien engagée (et la session rincée)? –

+0

Je pense que oui parce que si elle n'était pas rincée, la ligne non commentée ne ferait rien. –

+0

Pourriez-vous activer la journalisation de votre gestionnaire de transactions et mettre en veille prolongée pour voir que la configuration est correcte? –

Répondre

0

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

0

Essayez de définir explicitement la collection. par exemple.

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

Non, il ne fait rien. –

0

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.

+0

oui, vous avez raison mais j'utilise effectivement la bonne clé pour supprimer l'objet;) –

Questions connexes