Как удалить элемент из хэш-карты в режиме гибернации?


Я пытаюсь удалить элемент из хэш-карты с помощью hibernate.

Вот мой конфиг по коллекции:

@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 не удаляйте элемент в базе данных. Если я раскомментирую строку, чтобы получить размер списка (который принудительно загружает коллекцию), запись будет хорошо удалена.

В чем проблема ? как я могу достичь этого, не заставляя грузиться всю коллекцию ?

Править: Я заменяю карту списком, и она работает как шарм (без предварительной загрузки ее функцией size ())... Это очень странно... Итак, моя проблема решена со списком, но мне любопытно знать, почему он не запускается ?

3 2

3 ответа:

Попробуйте явно задать коллекцию. например

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

Поскольку вы сказали, что он работает, когда вы используете список вместо этого, возможно ли, что вы неправильно используете.удалить() функцию карты?

The .функция remove() на карте принимает ключ объекта, который вы хотите удалить, , а не сам объект.

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

The .функция remove() списка принимает объект , который вы хотите удалить;

myList.remove(MyObject); 

Править: я вижу, что вы сказали, что если вы раскомментируете эту одну строку, она работает правильно, так что это скорее всего, не относится.

Это была ошибка гибернации, теперь это исправлено в новой версии