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

既然您说它在您使用列表时有效,那么您是否可能错误地使用了地图的 .remove() 函数?

地图上的 .remove() 函数获取要删除的对象的 KEY ,而不是实际的 object

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

列表的 .remove() 函数获取您要删除的对象;

myList.remove(MyObject); 

编辑: 我看到你说如果你取消注释那一行,它可以正常工作,所以这很可能不适用。

于 2009-12-17T00:44:47.567 回答
0

这是一个休眠错误,现在已在较新版本中修复

于 2010-11-26T08:30:28.477 回答