Скрытие удаленных объектов - PullRequest
1 голос
/ 20 августа 2009

У меня есть следующий вариант использования: есть класс с именем Template, и с этим классом я могу создавать экземпляры класса ActualObject (ActualObject копирует свои исходные данные из шаблона). Класс Template имеет список Product: s.

Теперь самое сложное: пользователь должен иметь возможность удалять Продукты из базы данных, но эти удаления могут не повлиять на содержимое шаблона. Другими словами, даже если Продукт удален, Шаблон все равно должен иметь к нему доступ. Эту проблему можно решить, добавив флаг «Удалено» в Продукт. Если Продукт удален, его нельзя явно искать в базе данных, но его можно получить неявным образом (например, по ссылке в классе Template).

Идея заключается в том, что когда ActualObject создается из шаблона, пользователь уведомляется в пользовательском интерфейсе, что «Шаблон X имел Продукт Z с параметрами A, B и C, но этот продукт был удален и не может быть добавлен как таковой в ActualObject Z ".

Моя проблема в том, как мне пометить эти удаленные объекты как удаленные. Прежде чем кто-то предложит просто обновить флаг удаления вместо выполнения фактического запроса на удаление, моя проблема не так проста. Флаг удаления и его поведение должны присутствовать во всех POJO, а не только в Product. Это означает, что у меня будут проблемы с каскадом. Например, если я удаляю Шаблон, то Продукты также должны быть удалены, и каждый Продукт имеет ссылку на объект Price, который также должен быть удален, и каждая Цена может иметь ссылку на объект НДС и так далее. Все эти каскадные объекты должны быть помечены как удаленные.

Мой вопрос: как я могу сделать это разумным способом? Просмотр каждого объекта (который удаляется), проверка каждого поля на предмет ссылок, которые должны быть удалены, просмотр их ссылок и т. Д. Довольно трудоемок, и ошибки легко обнаруживаются.

Я использую Hibernate, мне было интересно, будут ли в Hibernate такие встроенные функции. Еще одна идея, о которой я подумал, состояла в том, чтобы использовать перехватчики hibernate для изменения фактического запроса на удаление SQL в запрос на обновление (я даже не уверен на 100%, что это возможно). Меня беспокоит только то, что Hibernate использует каскады во внешних ключах, другими словами, каскадное удаление выполняется базой данных, а не гибернацией.

Ответы [ 5 ]

2 голосов
/ 25 августа 2009

Моя проблема в том, как я должен пометить эти удаленные объекты как удаленные.

Я думаю, что вы выбрали очень сложный способ решения задачи. Было бы проще ввести ProductTemplate. Поместите в этот объект все необходимые свойства, которые вам нужны. А также вам нужна ссылка на экземпляр Product. Вместо того, чтобы отмечать Product, вы можете просто удалить его (и удалить все другие объекты, такие как цены). И, конечно же, вы должны очистить ссылку в ProductTemplate. При создании экземпляра ActualObject вы сможете уведомить пользователя соответствующим сообщением.

1 голос
/ 25 августа 2009
public interface Deletable {
  public void delete();
}

Пусть все ваши удаляемые объекты реализуют этот интерфейс. В своих реализациях обновите флаг deleted и попросите их также вызвать метод своих детей delete(), что подразумевает, что дочерние элементы тоже должны быть Deletable.

Конечно, после внедрения вам придется вручную определить, какие дети Deletable. Но это должно быть просто, по крайней мере.

1 голос
/ 25 августа 2009

Я думаю, вы пытаетесь сделать вещи намного более сложными, чем они должны быть ... в любом случае, вы пытаетесь обработать события Hibernate , взгляните на Глава 12 из Hibernate Reference , вы можете выбрать перехватчики или систему событий . В любом случае ... ну удачи :) 1009 *

0 голосов
/ 28 августа 2009

Флаг для удаления должен быть частью самого класса шаблона. Таким образом, все создаваемые вами объекты могут быть помечены как живые или удаленные. Маркировка объекта, подлежащего удалению, должна идти выше до базового класса.

0 голосов
/ 25 августа 2009

Если я понимаю, что вы запрашиваете, вы добавляете отношение @OneToMany между шаблоном и продуктом и выбираете правила каскадирования, вы сможете удалить все связанные продукты для данного шаблона. В вашем классе продукта вы можете добавить «удаленный» флаг, как вы предложили. Этот удаленный флаг будет использоваться вашим уровнем обслуживания / дао, например Вы можете использовать концепцию типа getProdcuts (boolean includeDeleted), чтобы определить, следует ли включать «удаленные» записи для возврата. Таким образом, вы можете контролировать то, что видят конечные пользователи, но все же предоставлять полную функциональность внутренним бизнес-пользователям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...