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?

Foi útil?

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ção

O .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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top