我们数据库中的几乎每个表都有一个 FK 到审计表,该表记录创建、更新和删除状态(日期和用户名)。
我们将审计表映射到审计类并像这样使用它:
@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"
)
最佳答案
IMO,实现软删除的最简单方法是在您的实体中添加一个标志并使用:
@SQLDelete
覆盖默认 Hibernatedelete
的注释(并执行标志的更新)@Where
(或@Filters
?)对您的实体和关联进行注释以过滤已删除的实体
虽然不确定这如何适合您的 Auditing
表。需要进一步探索和测试。
资源
关于java - Hibernate:如何只获取非逻辑删除的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3986833/