2

休止状態でハッシュ マップからアイテムを削除しようとしています。

コレクションの設定は次のとおりです。

@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() 関数によってロードせずに)...これは非常に奇妙です...だから私の問題はリストで解決されますが、私は 'なぜ実行されないのか知りたいですか?

4

3 に答える 3

0

コレクションを明示的に設定してみてください。例えば

c = getCharacteristics();
c.remove(...);
setCharacteristics(c); 
于 2009-12-14T21:46:11.007 に答える
0

これは休止状態のバグでしたが、新しいバージョンで修正されました

于 2010-11-26T08:30:28.477 に答える
0

代わりにリストを使用すると機能するとおっしゃっていましたが、マップの .remove() 関数を間違って使用している可能性はありますか?

マップの .remove() 関数は、実際のオブジェクトではなく、削除するオブジェクトの KEY を取ります。

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

リストの .remove() 関数は、削除するオブジェクトを受け取ります。

myList.remove(MyObject); 

編集: その1行のコメントを外すと正しく機能するとおっしゃっていたようですが、これはおそらく当てはまりません。

于 2009-12-17T00:44:47.567 に答える