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

时间:2016-12-02 08:52:16

标签: 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;

}

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

@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;
}

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

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果你必须使用@SQLDelete,那么我担心没有解决方案。

我设法使用spring-data-jpa + hibernate实现了一个软删除机制,并在不使用@SQLDelete的情况下映射了超类,但它需要创建自己的BaseRepository实现来覆盖SimpleJpaRepositoryImpl,然后替换使用softdelete实现删除方法。

在spring-data docs here中详细描述了这样做的方法。