gpt4 book ai didi

java - 如何在某些情况下忽略@SQLDelete注释

转载 作者:行者123 更新时间:2023-11-30 06:03:07 25 4
gpt4 key购买 nike

我想实现软删除,但仍然能够永久删除。有什么方法可以忽略声明的 @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...

}

最佳答案

我在我的一篇文章 Hibernate Tips 中更详细地解释了这一点。 。这是它的简短版本:

当您在EntityManager上调用remove方法时,Hibernate将执行@SQLDelete操作中定义的SQL语句。

您无法停用@SQLDelete注释。因此,如果您想从数据库中永久删除记录,则不能使用 EntityManager 的删除方法。您需要使用 JPQL 执行 SQL DELETE 语句,Criterianative查询。

以下是 JPQL DELETE 语句的示例:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

// do something ...

// add this if you fetched the Book entity in this session
em.flush();
em.clear();

Query query = em.createQuery("DELETE Book b WHERE id = :id");
query.setParameter("id", 1L);
query.executeUpdate();

em.getTransaction().commit();
em.close();

如果您在当前 Hibernate session 中获取了要删除的 Book 实体,则需要调用 flushclear 方法在执行 DELETE 语句之前在您的 EntityManager 上执行此操作。这可确保在删除记录之前将所有挂起的更改写入数据库。

关于java - 如何在某些情况下忽略@SQLDelete注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51877445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com