java - mundo - Hibernate: cómo buscar solo objetos no eliminados lógicamente
hola mundo hibernate netbeans (1)
OMI, la forma más fácil de implementar un borrado suave sería agregar un indicador en sus entidades y usar:
- la anotación
@SQLDelete
para anular ladelete
predeterminada de Hibernate (y realizar una actualización del indicador) - la
@Where
(o@Filters
?) en sus entidades y asociaciones para filtrar las entidades eliminadas
Sin embargo, no estoy seguro de cómo esto puede encajar con su tabla de Auditing
. Se requieren algunas exploraciones y pruebas adicionales.
Recursos
Casi todas las tablas de nuestra base de datos tienen un FK en la tabla de auditoría que registra el estado creado, actualizado y eliminado (fecha y nombre de usuario).
Mapeamos la tabla de auditoría a la clase de Auditoría y la usamos así:
@MappedSuperclass
public class BusinessObject extends DataObject {
private static final long serialVersionUID = -1147811010395941150L;
@OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
@JoinColumn(name = "AUD_ID")
private AuditingObject auditing;
...
Como era de esperar, casi todas las entidades se extienden desde BusinessObject.
¿Hay una manera fácil de decir, para cada objeto de negocio, solo recibir "auditing.deleted is null".
Intenté agregar @Where y @WhereJoinTable en businessObject, pero parece que esto no funciona como esperaba.
Actualmente, he hecho esto para una de mis consultas y esto funciona, pero odiaría hacer esto para todas las consultas ya que tenemos alrededor de 150.
@NamedQuery(
name="allCountries",
query="SELECT c FROM Country c"
+ " LEFT JOIN FETCH c.labelDefinition "
+ " LEFT JOIN FETCH c.labelDefinition.translations "
+ " WHERE c.auditing.deleted is null"
+ " ORDER BY c.code"
)