我们数据库中几乎每个表都有一个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扩展。
有一种简单的方法可以说,对于每个businessObject,只接收“auditing.deleted为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"
)
答案 0 :(得分:11)
IMO,实现软删除的最简单方法是在您的实体中添加一个标志并使用:
@SQLDelete
注释以覆盖默认的Hibernate delete
(并执行标志的更新)@Where
(或@Filters
?)注释,以过滤已删除的实体不确定这如何适合您的Auditing
表格。需要进行一些进一步的探索和测试。