在Hibernate中使用@MappedSuperClass进行软删除

ugu*_*kan 5 java hibernate jpa soft-delete

我有一个抽象的基类A,这是一个@MappedSuperClass.此外,有几个实体类从类扩展A.类A包含一个名为的属性STATUS,表示是否删除记录.

@MappedSuperclass
public abstract class A {

    @Id
    private Long id;

    @Column(nullable = false)
    private boolean status = true;

}
Run Code Online (Sandbox Code Playgroud)

我想要的是能够从A带有@SQLDelete注释的类中的所有子类上执行软删除.例如,我有一个类B extends A,每当我在类上调用delete时B,我希望它更新数据库上该记录的状态.

@Entity
@Table(name = "TempTable")
@SQLDelete(sql = "update TempTable set STATUS = 0 where ID = ?")  //Basically, I don't want 
                                                                  //to write this in every 
                                                                  //class. Instead write 
                                                                  //it to class A once.
@Where(clause = "STATUS = 1")
public class B extends A {
    private String alpha;
}
Run Code Online (Sandbox Code Playgroud)

现在我能够软删除,但为了这个我必须@SQLDelete在每个类中编写注释.我不希望重复,并希望在基类中编写A一次.在那里它将更新该记录的状态.

这可能吗?如果是的话,我该如何实现呢?

提前致谢.

小智 1

如果必须使用@SQLDelete那么恐怕没有解决方案。

我已经成功地使用 spring-data-jpa + hibernate 和映射的超类实现了软删除机制,而不使用 @SQLDelete,但它需要创建您自己的 BaseRepository 实现来覆盖 SimpleJpaRepositoryImpl,然后用您的 softdelete 替换删除方法执行。

spring-data 文档中详细描述了执行此操作的方法,此处

  • 请记住,这种方法不适用于一对多关系。例如,如果您有一个带有“@OneToMany List<Child>children”的实体,则“entity.getChildren().remove(0)”将在持久化时触发实际的“delete”查询。 (3认同)