Мягкое удаление с помощью @MappedSuperClass в Hibernate

У меня есть абстрактный базовый класс 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, я хочу, чтобы он обновлял статус этой записи в базе данных.

@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 один раз. Там он обновит статус этой записи.

Это возможно? Если да, то как я могу этого достичь?

Заранее спасибо.


person uguurozkan    schedule 02.12.2016    source источник
comment
Вам удалось получить ответ на этот?   -  person zalis    schedule 03.09.2017
comment
Неа. Закончилось тем, что написали это во всех классах.   -  person uguurozkan    schedule 28.09.2017


Ответы (1)


Если вы должны использовать @SQLDelete, то, боюсь, решения нет.

Мне удалось реализовать механизм мягкого удаления с помощью spring-data-jpa + hibernate и сопоставленных суперклассов без использования @SQLDelete, но для этого требуется создать собственную реализацию BaseRepository для переопределения SimpleJpaRepositoryImpl, а затем заменить метод удаления на ваш softdelete реализация.

Способ сделать это хорошо описан в документах spring-data, здесь.

person Manuel Padilha    schedule 29.05.2018
comment
Имейте в виду, что этот подход не будет работать должным образом для отношений "один ко многим". Например, если у вас есть объект с @OneToMany List<Child> children, то entity.getChildren().remove(0) вызовет фактический запрос delete при сохранении. - person Timekiller; 13.06.2019