Hibernate:如何仅获取未逻辑删除的对象

7

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

我们将审计表映射到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扩展而来的。

是否有一种简单的方法,可以为每个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"
)
1个回答

12

在我看来,实现软删除的最简单方法是在实体中添加一个标记并使用以下内容:

  • @SQLDelete注释来覆盖默认的Hibernatedelete(并执行标记的更新)
  • 在您的实体和关联上使用@Where(或@Filters?)注释来过滤已删除的实体

不确定这如何与您的Auditing表匹配。需要进一步探索和测试。

资源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接