java如何在某些情况下忽略@SQLDelete注释
我想实现软删除,但仍然能够永久删除。有没有办法忽略声明的@SQLDelete()注释,或者说:
@SQLDelete("IF expression THEN UPDATE statement ELSE delete statement")
编辑:
这就是所讨论的实体
@Indexed
@Entity
@DynamicUpdate
@FilterDefs({
@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")}),
@FilterDef(name = "deleteFilter")
})
@Filters({
@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId"),
@Filter(name = "deleteFilter", condition = "deleted = false")
})
@SQLDelete(sql ="UPDATE Antwort SET deleted = true, date_modified = NOW() WHERE ID = ?; DELETE FROM Antwort WHERE deleted = true AND kundenentwurf_id IS NOT NULL", check = ResultCheckStyle.NONE)
public class Antwort implements TenantSupport, ISoftDeleteModel{
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String tenantId;
@Column(nullable = false)
private Boolean deleted;
private Date dateModified;
@ManyToOne(fetch = FetchType.LAZY)
private Organisation organisation;
@ManyToOne(fetch = FetchType.LAZY)
private Projekt projekt;
@ManyToOne(fetch = FetchType.LAZY)
private Kundenentwurf kundenentwurf;
private Integer nummer;
private String frage;
private String antwort;
//getters, setters and contructors...
}
# 1 楼答案
我在我的Hibernate Tips中更详细地解释了这一点。以下是它的简短版本:
在
EntityManager
上调用remove方法时,Hibernate将执行@SQLDelete
操作中定义的SQL语句无法停用
@SQLDelete
批注。因此,如果要从数据库中永久删除记录,则不能使用EntityManager
的remove方法。您需要使用JPQL、Criteria或native查询执行SQL DELETE语句以下是JPQL DELETE语句的示例:
如果获取了要在当前Hibernate会话中删除的
Book
实体,则需要在执行DELETE语句之前调用EntityManager
上的flush
和clear
方法。这确保在删除记录之前,所有挂起的更改都写入数据库