我尝试使用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()函数加载它)......这很奇怪......所以我的问题用列表解决了,但我很好奇知道它为什么不运行?
答案 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错误,现在已在较新版本中修复