Criterios de filtración global de Hibernate.
Pregunta
¿Hay una manera de agregar un solo criterio en un nivel de fábrica de sesión (configuración) que se aplicará a todos los sitios recibidos con una sesión? Tenemos el requisito de no eliminar ninguna fila de nuestra base de datos, pero " marcar " Entidades eliminadas como tales para que no participen en ninguna otra operación.
Sé que podemos recuperar todos los entits a través de una interfaz común (por ejemplo, un objeto Dao base común), pero el enfoque con filtrado global sería menos propenso a errores, ya que no requiere el conocimiento del uso de esta interfaz común. .
Solución
La Documentación de Hibernate explica esto un poco más . Parece que la mejor manera de manejar esto es con los filtros.
En primer lugar, defina un fitler en una clase o colección como tal:
<filter-def name="IsDeletedFilter">
<filter-param name="IsDeleted" type="bool"/>
</filter-def>
Luego lo adjuntas a una clase o colección:
<class/set ...>
...
<filter name="IsDeletedFilter" condition=":IsDeleted = Is_Deleted"/>
Por desgracia, debes hacer esto con todas las clases que desees que se borren por software. Pero es posible que pueda asignar una clase base SoftDeleteEntity
y tener una tabla por jerarquía de subclases.
También he visto a algunas personas decir que pueden hacer esto con los oyentes, aunque no sé cómo.