2013-02-16 57 views
1

我想从嵌入式地图中删除条目。如果对象CategoryTag被删除时,我想在一个拦截器,它从地图中删除的条目执行HQL查询:休眠:HQL从嵌入式地图中删除

“产品”型号:

@NotNull 
@ElementCollection 
@CollectionTable(name = "producttag", [email protected](name="id")) 
protected Map<CategoryTag, String> tags = new HashMap<CategoryTag, String>(); 

我有点空白,我怎么可以编写HQL查询。它从问题开始,我不知道如何在删除查询中引用地图。 delete Product.tags t where t.key = :tagProduct.tags is not mapped异常而失败。

有人可以帮助我吗?

回答

0

标签不是实体。

A delete operation only applies to entities of the specified class and its subclasses. It does not cascade to related entities. 

这就是为什么你会收到错误。正确的方法是加载实体,更新其集合,然后保存该对象。

Product p = session.load(Product.class, id); 
p.removeTags(tag); 
session.flush(); 
+0

'CategoryTag'没有对'Product'的引用,所以它基本上不知道哪些产品正在使用它。因此,按照您的建议,我必须选择包含该标签的所有产品,然后按照您的建议循环删除它。但是,我想知道是否有一种方法可以用一个简单的语句来实现。我可以用一个本地查询来做到这一点:'从producttag删除tag_KEY =:tag',但是这会导致缓存问题,所以我想知道是否有办法在HQL中完成它。 – Flo 2013-02-16 12:29:15

+0

我相信你仍然需要按照我告诉你的方式来做,这样可以帮助你跳过缓存问题。 – 2013-02-16 17:45:24