У меня есть следующий вариант использования: есть класс с именем Template, и с этим классом я могу создавать экземпляры класса ActualObject (ActualObject копирует свои исходные данные из шаблона). Класс Template имеет список Product: s.
Теперь самое сложное: пользователь должен иметь возможность удалять Продукты из базы данных, но эти удаления могут не повлиять на содержимое шаблона. Другими словами, даже если Продукт удален, Шаблон все равно должен иметь к нему доступ. Эту проблему можно решить, добавив флаг «Удалено» в Продукт. Если Продукт удален, его нельзя явно искать в базе данных, но его можно получить неявным образом (например, по ссылке в классе Template).
Идея заключается в том, что когда ActualObject создается из шаблона, пользователь уведомляется в пользовательском интерфейсе, что «Шаблон X имел Продукт Z с параметрами A, B и C, но этот продукт был удален и не может быть добавлен как таковой в ActualObject Z ".
Моя проблема в том, как мне пометить эти удаленные объекты как удаленные. Прежде чем кто-то предложит просто обновить флаг удаления вместо выполнения фактического запроса на удаление, моя проблема не так проста. Флаг удаления и его поведение должны присутствовать во всех POJO, а не только в Product. Это означает, что у меня будут проблемы с каскадом. Например, если я удаляю Шаблон, то Продукты также должны быть удалены, и каждый Продукт имеет ссылку на объект Price, который также должен быть удален, и каждая Цена может иметь ссылку на объект НДС и так далее. Все эти каскадные объекты должны быть помечены как удаленные.
Мой вопрос: как я могу сделать это разумным способом? Просмотр каждого объекта (который удаляется), проверка каждого поля на предмет ссылок, которые должны быть удалены, просмотр их ссылок и т. Д. Довольно трудоемок, и ошибки легко обнаруживаются.
Я использую Hibernate, мне было интересно, будут ли в Hibernate такие встроенные функции. Еще одна идея, о которой я подумал, состояла в том, чтобы использовать перехватчики hibernate для изменения фактического запроса на удаление SQL в запрос на обновление (я даже не уверен на 100%, что это возможно). Меня беспокоит только то, что Hibernate использует каскады во внешних ключах, другими словами, каскадное удаление выполняется базой данных, а не гибернацией.