如何在Hibernate中的关联映射表上执行软删除?

时间:2017-03-14 14:50:04

标签: java hibernate many-to-many soft-delete

所以虽然我个人讨厌软删除,但我在一个项目中工作,每个表必须只能软删除。我不知道如何处理关联表上的软删除,其字段如下所示:

@ManyToMany(targetEntity = AdvertisementVendor.class, fetch = FetchType.EAGER)
@JoinTable(name = "advertisement_version_advertisement_vendor_association",
        joinColumns = @JoinColumn(name = "advertisement_version_id"),
        inverseJoinColumns = @JoinColumn(name = "advertisement_vendor_id"))
private Set<AdvertisementVendor> _advertisement_vendors = new HashSet<>();

我已经看过如何做soft deletes,但我不确定如何将其应用于关联表。

更新:

根据Dragan Bozanovic的建议,我将我的专栏更新为:

    @ManyToMany(targetEntity = AdvertisementVendor.class, fetch = FetchType.EAGER)
@JoinTable(name = "advertisement_version_advertisement_vendor_association",
        joinColumns = @JoinColumn(name = "advertisement_version_id"),
        inverseJoinColumns = @JoinColumn(name = "advertisement_vendor_id"))
@WhereJoinTable(clause = "is_deleted = 0")
@SQLDelete(sql = "UPDATE advertisement_version_advertisement_vendor_association SET is_deleted = 1 WHERE advertisement_version_id = ? AND advertisement_vendor_id = ?", check = ResultCheckStyle.COUNT)
@SQLInsert(sql = "INSERT INTO advertisement_version_advertisement_vendor_association " +
        "(advertisement_version_id, advertisement_vendor_id, is_deleted) VALUES(?, ?, 0) " +
        "ON DUPLICATE KEY UPDATE is_deleted = 0")
private Set<AdvertisementVendor> _advertisement_vendors = new HashSet<>();

但这似乎不起作用。它似乎忽略了@SQLDelete,只是删除了映射。

更新2:

忽略第一次更新,它与不同的代码有关。上面的示例按原样运行。

2 个答案:

答案 0 :(得分:1)

您可以使用@WhereJoinTable过滤连接表的条件:

  

要添加到集合连接表的Where子句。该条款是   用SQL编写。与Where一样,常见的用例是   实施软删除。

答案 1 :(得分:0)

我遇到了类似的问题,虽然您的解决方案确实有效,但除了@SQLDelete之外,我还必须添加@SQLDeleteAll注释。

我遇到的问题是,当我清除HashSet中的所有条目或删除父对象时,它仍在调用默认的delete语句。

道歉,如果我的术语有点偏离,我对Hibernate来说还是一个新手。