【发布时间】:2017-12-06 11:30:49
【问题描述】:
给定两个实体:
PurchaseProductGroup-
PurchaseProduct,它有一个status列,可以是'A'(活动)或'D'(已删除)
以及PurchaseProductGroup中定义的多对多关系:
/** The purchase products linked to this group. */
@ManyToMany
@JoinTable(name = "purchaseprodgrp_purchaseprod",
joinColumns = @JoinColumn(name = "ppg_id"),
inverseJoinColumns = @JoinColumn(name = "ppr_id"))
private List<PurchaseProduct> purchaseProducts;
我该如何限制这一点,以便排除状态为 'D' 的 purchaseProducts?
我尝试过的事情
已尝试在 @ManyToMany 注释下方添加以下内容,但均因列的“无效标识符”异常而失败:
@Where(clause = "status <> 'D'")@WhereJoinTable(clause = "purchaseProduct.status <> 'D'")
还尝试在实体级别使用添加 @Where(clause = "status <> 'D'"),但这似乎不会影响关系集合的内容 - 由 this question 支持。
【问题讨论】:
-
我不确定 Hibernate 是否可以实现您的确切想法。如果支持,我们可以在
status列本身上添加检查约束,但这会将所有'D'值完全从表中排除。您最终可能会使用的方法只是在查询中添加WHERE子句。顺便说一句,这根本不是最糟糕的事情,尤其是如果您正确调整查询。 -
希望在代码中处理实体本身时始终排除已删除的记录(而不是使用显式查询)。对列本身施加约束的第一个建议似乎是一个不错的建议,请您进一步解释一下如何做到这一点?
-
不,约束方法对您不起作用,因为它会阻止具有
'D'的所有 记录进入数据库。我可能会在这里使用WHERE子句。无论如何,如何提取实际数据的逻辑属于 IMO 的查询方面。 -
我认为约束方法是将
@Where(clause = "status <> 'D'")放在PurchaseProduct实体的顶部。你是说如果它试图通过调用setStatus('D')来更新持久的PurchaseProduct,这实际上会阻止删除工作? -
请编辑您的问题并告诉我们您将
@Where和@WhereJoinTable注释放在哪里。
标签: oracle hibernate many-to-many jointable hibernate-filters