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