Есть ли способ добавить единый критерий на уровне фабрики сеанса (конфигурации), который будет применяться к объектам все, полученным с помощью сеанса? У нас есть требование не удалять какие-либо строки из нашей базы данных, а «отмечать» удаленные объекты как таковые, чтобы они не участвовали в каких-либо дальнейших операциях.
Я знаю, что мы можем просто получить все объекты через общий интерфейс (например, общий базовый объект Dao), но подход с глобальной фильтрацией будет менее подвержен ошибкам, поскольку не требует знания об использовании этого общего интерфейса.




Документация по Hibernate уточняет это немного подробнее. Похоже, что лучший способ справиться с этим - использовать фильтры.
Сначала вы определяете фитлер для класса или коллекции следующим образом:
<filter-def name = "IsDeletedFilter">
<filter-param name = "IsDeleted" type = "bool"/>
</filter-def>
Затем вы прикрепляете его к классу или коллекции:
<class/set ...>
...
<filter name = "IsDeletedFilter" condition = ":IsDeleted = Is_Deleted"/>
Увы, вы должны сделать это с каждым классом, который хотите мягко удалить. Но вы можете отобразить базовый класс SoftDeleteEntity и создать таблицу для иерархии подклассов.
Я также видел, как некоторые люди утверждали, что могут делать это со слушателями, хотя я не знаю, как это сделать.