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