7

几乎我们数据库中的每个表都有一个审计表的 FK,该表记录创建、更新和删除状态(日期和用户名)。

我们将审计表映射到 Auditing 类并像这样使用它:

@MappedSuperclass
public class BusinessObject extends DataObject {

    private static final long serialVersionUID = -1147811010395941150L;

    @OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    @JoinColumn(name = "AUD_ID")
    private AuditingObject auditing;
...

如您所料,几乎每个实体都从 BusinessObject 扩展而来。

有没有一种简单的说法,对于每个业务对象,只接收“auditing.deleted is null”。

我尝试在 businessObject 中添加 @Where 和 @WhereJoinTable ,但这似乎不像我预期的那样工作。

目前,我已经对我的一个查询执行了此操作,并且此操作有效,但我不想对所有查询执行此操作,因为我们有大约 150 个查询。

@NamedQuery(
    name="allCountries",
    query="SELECT c FROM Country c"
        + " LEFT JOIN FETCH c.labelDefinition "
        + " LEFT JOIN FETCH c.labelDefinition.translations "
        + " WHERE c.auditing.deleted is null"
        + " ORDER BY c.code"
)
4

1 回答 1

12

IMO,实现软删除的最简单方法是在您的实体中添加一个标志并使用:

  • @SQLDelete用于覆盖默认 Hibernate的注释delete(并执行标志的更新)
  • 您的实体和关联上的@Where(或@Filters?)注释以过滤已删除的实体

不过,不确定这如何适合您的Auditing桌子。需要进行一些进一步的探索和测试。

资源

于 2010-10-21T15:50:18.793 回答