Como posso remover um item de um HashMap em hibernação?
Pergunta
Eu tento excluir um item a partir de um mapa de hash com Hibernate.
Aqui está a minha config na coleção:
@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;
}
e aqui é a minha função remove no mesmo objeto:
@Transactional
public void removeCharacteristic(Characteristic charact)
{
// getCharacteristics().size();
getCharacteristics().remove(charact.getShortcut());
}
Usando o removeCharacteristic não exclua o item no banco de dados. Se eu remover o comentário da linha para obter o tamanho da lista (que carregam força da coleção), o registro é bem apagada.
Qual é o problema? como posso alcançá-lo sem forçar a carga de toda a coleção?
EDIT: Eu substituí o mapa por um List, e funciona como um encanto (sem carregá-lo previamente pela função size ()) ... Isto é muito estranho ... Então, meu problema é resolvido com a lista, mas estou curioso saber por que ele não é executado?
Solução 3
Este foi um bug de hibernação, este está agora corrigido na versão mais recente
Outras dicas
Tente ajustar explicitamente a coleção. por exemplo.
c = getCharacteristics();
c.remove(...);
setCharacteristics(c);
Uma vez que você disse que ele funciona quando você usa uma lista em vez disso, é possível que você está incorretamente usando a função .remove () do mapa?
funçãoO .remove () em um mapa pega a chave do objeto que deseja remover, não o objeto real .
myMap.remove(MyObject.getKey()); //Or however you would get the key
função O .remove () de uma lista leva o objeto que você deseja remover;
myList.remove(MyObject);
Edit: Eu vejo que você disse que se você descomente que uma linha, ele funciona corretamente, então isso provavelmente não se aplica.