Hibernate Entity Listener для операции удаления именованного запроса

Для нашего приложения нам нужно реализовать триггер с использованием гибернации. Одним из лучших решений, к которому мы могли прийти, был Entity listerner с использованием Annotation, так как нам нужно прослушивать конкретное изменение сущности.

Все работает хорошо, кроме удаления с именованными запросами, которое не дает никаких событий.

Реализация кода ** Entity** — здесь мы добавили прослушиватель

@Entity
@EventListeners(EmployeeEventListener.class)
public class Employee {

  @Id
  private String uid;
  @Basic
  private Calendar lastUpdated;

Прослушиватель объектов –

Прослушиватель принимает измененный объект и выполняет намеченную операцию.

public class EmployeeEventListener {
  @PrePersist
  public void prePersist(Object object) {
    Employee employee = (Employee)object;
    employee.setUID(UIDGenerator.newUUI());
    employee.setLastUpdated(Calendar.getInstance());
  }
  @PostUpdate
  public void postUpdate(Object object) {
    Employee employee = (Employee)object;
    employee.setLastUpdated(Calendar.getInstance());
  }

@PrePersist и @PostUpdate работали хорошо, когда я использовал save или saveorupdate в диспетчере сущностей. Но при выполнении запроса на удаление именованного я не получаю события для @PreRemove и @PostRemove

Я также хотел бы получить событие для удаления.


person prasanth pai    schedule 15.08.2013    source источник


Ответы (1)


Это невозможно: The Interceptor interface provides callbacks from the session to the application и объект, удаленный с помощью собственного SQL, не переходит в сеанс, поэтому обратный вызов не выполняется.

person Luca Basso Ricci    schedule 15.08.2013
comment
Спасибо, беллабакс, так что это не сработает. Ну, я подумал, почему в спящем режиме есть функция событий и обратных вызовов, если она работает в случаях, когда сущность загружается в сеанс, и не будет полезна для других альтернативных способов работы с БД (например, с использованием hql или именованных запросов). Конечно, эти запросы выполняются спящим режимом, так почему бы не дать мне обратный вызов. Является ли триггер БД единственным вариантом здесь для захвата именованного запроса? - person prasanth pai; 16.08.2013
comment
Подумайте об этом запросе (HQL или SQL, не имеет значения): delete * from table where <cond>. Вы удаляете объект непосредственно из базы данных, и ORM, чтобы позволить прослушивателю, должен получить весь объект @Id (по крайней мере), чтобы позволить слушателям работать. Я думаю, что это может плохо сказаться на производительности системы. Мне никогда не нужен был слушатель запроса, и мы используем триггер для нашей цели. - person Luca Basso Ricci; 16.08.2013
comment
да .. на моем пути к использованию триггеров .. Спасибо - person prasanth pai; 16.08.2013
comment
Вы имеете в виду, что если использовать чистый SQL, например Query query = sessionFactory.getCurrentSession().createSQLQuery("update ... set ... where ...");, то query.executeUpdate();. Interceptor не сработает, верно? - person coderz; 12.02.2016
comment
Проверил и обнаружил, что Interceptor не сработает в моем случае. - person coderz; 17.02.2016
comment
Итак, работает ли в этом случае система событий hibernate? - person Kiran M N; 07.03.2016