Когда удаляются объекты, записанные в eclipselink UnitOfWorkChangeSet? - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь получить список удаленных сущностей в операции базы данных, чтобы реализовать пользовательский аудит. К сожалению, недостаточно просто переопределить метод remove для EntityManager из-за каскадного удаления.

Мне удалось найти новые и обновленные сущности, используя EntityManager и его UnitOfWorkChangeSet. Любопытно, что список удаленных объектов всегда пуст.

Я подозреваю, что способ, которым клиент вызывает метод, является проблематичным, но я не совсем уверен. Клиент удаляет элементы из коллекции сущностей сущности, удаляя их из объекта и затем вызывая метод persist с сущностью, содержащей коллекцию. Этот подход работает с точки зрения удаления объектов из базы данных с использованием каскадного механизма, но я не могу найти удаленные объекты в списке удаленных объектов.

Доступ к удаленным объектам в наборе изменений:

Map<ObjectChangeSet, ObjectChangeSet> deletedObjects =
        entityManager.unwrap(UnitOfWork.class)
        .getCurrentChanges()
        // returns always an empty list
        .getDeletedObjects();

  return deletedObjects.values().stream()
        .map(v -> v.getUnitOfWorkClone())
        .collect(Collectors.toList());

Этот код выполняется каждый раз, когда вызывается метод persist. Всегда возвращает пустой список.

Почему getDeletedObjects() всегда возвращает пустой список и когда объект добавляется в этот список?

1 Ответ

0 голосов
/ 10 сентября 2018

Сводка управления

entityManager.getTransaction().begin();
entityManager.delete(entity);
final Map deletedObjects = 
    ((RepeatableWriteUnitOfWork) entityManager
        .unwrap(UnitOfWork.class)).getDeleted();
// process deleted objects
entityManager.getTransaction().commit();

Объяснение

Отказ от ответственности : я связан с древней версией (2.0.2) Eclipse-Link, поэтому это решение, вероятно, устарело.

Моей первой ошибкой была попытка получить удаленные объекты вне транзакции. Хотя этот подход работает для новых и измененных объектов, он не подходит для удаленных объектов.

Моя вторая ошибка - попытка доступа к currentChanges. Во время отладки я обнаружил, что метод getCurrentChanges() выполняется для правильного набора изменений с моими удаленными объектами, но дает набор изменений без них. Поэтому необходимо разложить распакованный UnitOfWork на RepeatableWriteUnitOfWork. В более поздних версиях может быть возможно развернуть непосредственно к этому классу, как намекает Крис . После приведения я смог получить доступ к списку удаленных объектов напрямую.

...