Java 使用更新级联休眠软删除

Java 使用更新级联休眠软删除,java,mysql,hibernate,spring-mvc,Java,Mysql,Hibernate,Spring Mvc,以防我有3个相互连接的类 客房类 @Entity @Table(name="table_room") Class Room{ @Id @GeneratedValue @Column(name="id_room") private Integer id; @Column(name="name") private String name; @OneToMany(mappedBy="room") private List<Per

以防我有3个相互连接的类

客房类

@Entity
@Table(name="table_room")
Class Room{
    @Id
    @GeneratedValue
    @Column(name="id_room")
    private Integer id;

    @Column(name="name")
    private String name;

    @OneToMany(mappedBy="room")
    private List<Person> people;

    @Column(name="deleted")
    private int deleted;
}
 @Entity
@Table(name="table_person")
Class Person{
    @Id
    @GeneratedValue
    @Column(name="id_person")
    private Integer id;

    @Column(name="name")
    private String name;

    @ManyToOne
    @JoinColumn(name="id_room")
    private Room room;

    @OneToMany(mappedBy="person")
    private List<Phone> phones;

    @Column(name="deleted")
    private int deleted;
}

这里我要做的是实现软删除,为已删除的项目在已删除列中插入值1,为已存在的项目插入值0。此外,我希望级联我的删除,因此,如果任何房间被删除,那么与该房间相关的每个人和电话也将被删除(“删除”列值设置为1)。我的问题是如何在
Hibernate
上实现这一点?有什么优雅的方法来实现这个功能吗?

使用Hibernate实现软删除的最佳方法是在类上使用@SQLDelete注释

确保映射设置为级联删除

调用session.delete(您的类)应实现软删除

//用于覆盖正常的删除行为
@SQLDelete(sql=“UPDATE(table_name)SET deleted='1'其中id=?”)
//可选使用此选项从get中排除已删除的元素
@其中(子句=“已删除的“1”)
//或者(如果您偶尔需要加载已删除的项目,也可以使用筛选器)
@FilterDef(name=“ProductFilter”,defaultCondition=“deleted 1”)

您只是在设置标志。已删除=1,已删除=0。它实际上并没有删除。我不明白你想通过这样做来实现什么。这很难是最好的方式,因为这会污染具有大量数据访问逻辑的实体。如果可能的话,通过重写基本存储库方法来实现这一点将是一种更好的方法。如果不可能,那么这几乎是唯一的办法。绝对不是个好办法。
 @Entity
@Table(name="table_phone")
Class Phone{
    @Id
    @GeneratedValue
    @Column(name="id_person")
    private Integer id;

    @Column(name="name")
    private String name;

    @ManyToOne
    @JoinColumn(name="id_person")
    private Person person;

    @Column(name="deleted")
    private int deleted;
}
//used to overide the normal delete behavior
@SQLDelete(sql="UPDATE (table_name) SET deleted = '1' WHERE id = ?")
//optional Use this to exclude deleted element from get 
@Where(clause="deleted <> '1'")
//OR (Filter may also be used if you need to load deleted items occasionally)
@FilterDef(name="ProductFilter",defaultCondition="deleted <> 1 ")