Как я могу удалить элемент из Hashmap в Hibernate? - PullRequest
2 голосов
/ 14 декабря 2009

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 17 декабря 2009

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

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

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

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

myList.remove(MyObject); 

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

0 голосов
/ 26 ноября 2010

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

0 голосов
/ 15 декабря 2009

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

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