2009-08-20 3 views
1

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

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

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

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

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

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

+0

Зачем вам нужно каскад? Просто отметьте Продукт, а затем из Pojo поместите внешние ключи в Продукт или загрузите из фильтра db удаленным флагом в Продукт. т. Е. Держите делит флаг в одном месте – Mark

ответ

2

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

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

+0

Мой пример был всего лишь одним прецедентом, есть еще много, и поэтому мы хотели бы найти более общее решение. –

+0

Ограничение ролей классов - общая стратегия. Вы можете следить за ним каждый день. –

1

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

+0

Как я уже упоминал, я думал о перехватчиках, но я беспокоюсь о том, использует ли hibernate каскады внешнего ключа в базе данных, и в этом случае я не могу охватить все операции удаления с помощью перехватчиков. –

0

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

+0

Я пропустил каскадное обновление свойства «deleted» для дочерних объектов. Что делать, если вы внедрили эту концепцию в отдельный объект, например «Deleted», и используете общие ссылки от родителя и дочернего элемента. Таким образом, когда вы обновляете родительский объект «Удаленный», все связанные дочерние элементы также будут обновлять свои ссылки. –

1
public interface Deletable { 
    public void delete(); 
} 

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

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

0

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

Смежные вопросы