Hibernate: как выбрать только не логически удаленные объекты - PullRequest
6 голосов
/ 21 октября 2010

Почти каждая таблица в нашей базе данных имеет FK для таблицы Auditing, которая регистрирует созданный, обновленный и удаленный статус (дата и имя пользователя).

Мы сопоставили таблицу аудита с классом Auditing и используем ее следующим образом:

@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;
...

Как и следовало ожидать, почти каждая сущность происходит от BusinessObject.

Существует ли простой способ сказать, что для каждого businessObject нужно только получить "auditing.deleted is null".

Я пытался добавить @Where и @WhereJoinTable в businessObject, но, похоже, это не сработало, как я ожидаю.

В настоящее время я сделал это с одним из моих запросов, и это работает, но я бы не хотел делать это для всех запросов, так как у нас около 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"
)

1 Ответ

11 голосов
/ 21 октября 2010

IMO, самый простой способ реализовать мягкое удаление - добавить флаг в ваши сущности и использовать:

  • аннотацию @SQLDelete для переопределенияHibernate по умолчанию delete (и выполнить обновление флага)
  • @Where (или @Filters?) для ваших объектов и ассоциаций дляотфильтруйте удаленные объекты

Не уверен, как это может соответствовать вашей таблице Auditing.Требуются дальнейшие исследования и тестирование.

Ресурсы

...