2017-03-14 28 views
0

因此,虽然我个人讨厌软删除,但我在一个项目中工作,每个表只能软删除。林不知道如何处理上的关联表软删除,该字段看起来像这样:如何在Hibernate的关联映射表上执行软删除?

@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,但我不知道我怎么会它应用到了关联表。

UPDATE:

以德拉甘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:

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

回答

1

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

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

+0

解决了一个问题,谢谢,但也有更改连接表上的删除设置删除标志,并且还取消删除标志,而不是插入,如果删除了某些东西,然后读取 –

+0

@ Mr.MonoChrome我假设你可以使['SQLDelete'](http://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/annotations/SQLDelete.html)和['SQLInsert'](http://docs.jboss .org/hibernate/orm/5.2/javadocs/org/hibernate/annotations/SQLInsert.html)。 –

0

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

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

道歉,如果我的术语有点关闭,我仍然是Hibernate的新手。