如何从Hibernate中的Hashmap中删除项目?

时间:2009-12-14 17:21:37

标签: hibernate jpa hashmap persist

我尝试使用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不会删除数据库中的项目。 如果我取消注释该行以获取列表的大小(强制加载该集合),则该记录将被删除。

有什么问题?如何在不强制整个集合的负载的情况下实现它?

编辑: 我用List替换地图,它像魅力一样运行(之前没有通过size()函数加载它)......这很奇怪......所以我的问题用列表解决了,但我很好奇知道它为什么不运行?

3 个答案:

答案 0 :(得分:0)

尝试明确设置集合。 e.g。

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

答案 1 :(得分:0)

既然您说使用列表时它可以正常工作,您是否可能错误地使用了地图的.remove()函数?

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

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

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

myList.remove(MyObject); 

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

答案 2 :(得分:0)

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