@PreRemove не запускается на дочерней сущности при удалении родителя CASCADE - PullRequest
1 голос
/ 12 января 2020

В настоящее время я работаю над проектом Springboot и столкнулся с проблемой:
Я хочу запустить метод перед каждым дочерним , и мой код находится ниже.

У меня есть Родительский класс и Дочерний один со следующей конфигурацией:

@Entity
public class Parent implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "parent")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private List<Child> children = new ArrayList<>();
}
@Entity
public class Child implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "child_id", nullable = false)
    @Getter(onMethod = @__({@JsonIgnore}))
    private Parent parent;

    @PreRemove
    void test() {
        System.out.println("Before removing");
    }
}

Что я хочу: Когда объект Parent удаляется, Anottation @OnDelete(action = OnDeleteAction.CASCADE) будет запущен, и каждый связанный с ним дочерний объект также будет удален, но я хочу сделать некоторые логи c, прежде чем это произойдет.

Что происходит: Когда объект Parent удаляется, аннотация @OnDelete(action = OnDeleteAction.CASCADE) срабатывает, и каждый связанный с ним дочерний объект удаляется, но метод с @PreRemove не запускается.

Нужно ли добавить дополнительные настройки?

1 Ответ

0 голосов
/ 12 января 2020

Кажется, есть проблемы с отображением. Вам нужно создать отдельный класс обработчика событий и упомянуть имя класса слушателя событий на дочернем объекте (вы можете создать класс c stati и в самом объекте). Также в родительской сущности вам нужно иметь опцию cascade.ALL

@Entity
@Table(name="PARENT")
public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

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

    @OneToMany(mappedBy = "parent",cascade = CascadeType.ALL)
    @OnDelete(action = OnDeleteAction.CASCADE)
    List<Child> childList=new ArrayList<>();


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void addChild(Child child)
    {
        child.setParent(this);
        childList.add(child);
    }
}

Дочерняя сущность с аннотацией прослушивателя событий на уровне класса

@Entity
@Table(name="CHILD")
@EntityListeners(ChildEntityListener.class)
public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

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

    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    Parent parent;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }

}

Класс прослушивателя событий

public class ChildEntityListener {

    @PreRemove
    void test(Child child) {
        System.out.println("Before removing Child Entity");
    }
}

вызывающий код для него

public void entityListener() {
    Parent parent = new Parent();
    parent.setName("Test Parent");

    Child child = new Child();
    child.setName("Test Child");
    parent.addChild(child);

    Child child1 = new Child();
    child1.setName("Test Child 2");
    parent.addChild(child1);

    parentRepo.save(parent);


    List<Parent> parentList = parentRepo.findAll();
    for (Parent p : parentList) {
        parentRepo.delete(p);

    }

}

Более подробную информацию можно найти здесь введите описание ссылки здесь

Примечание: - Как указано в создании комментария и добавление класса EventListener и размещение аннотации на дочернем объекте необязательно.

...