Ух! Полная каша!
•при запуске все объекты создаются, согласно сохранённым данным в БД, и заносятся в основной список (назовём его так ^_^).
Из базы данные дергаются ТОЛЬКО по запросу конечного юзверя. Заранее все объекты грузить маразм.
•При создании нового объекта - он добавляется не сразу в основной список, доступный всем, а в приватный список измененных объектов менеджера, проводящего изменения.
При создании объекта он должен СРАЗУ комитеться в базу, кроме помещения в ваши списки. После соммита он становится достоянием общества.
•При изменении уже существующего объекта - он копируется и копия добавляется в тот же список. Основной, доступный всем, список остаётся без изменений.
Очень спорное утверждение. Оно означает что другие пользователи выполненного изменения не увидят, и некоторые, самые умные, зная что такие изменения нужно сделать, дружно начнут колупать один и тот-же объект. Вы голову сломаете решая какое изменения является самым главным и нужным изменением. Будите соммитеть все подряд? Юзвери прийдут и морду вам набью. Причем, будут правы.
Если привелигерованный, я подчеркиваю, ПРИВЕЛЕГИРОВАННЫЙ (ибо остальным этот объек RO) пользователь внес измениня в объект, он должен коммитеться, и после этого обновлятся объект который видят ВСЕ. После этого вы должны всем активным клиентам которые в данный момент вылупив глаза зырят на ваш объект, послать месагу на обновление видимой ими информации. Клиент это должен отработать, иначе будут возникать врпросы с угрозой разобраться с этим гребанным программистом.
•При удалении - опять же создаётся копия, но помещается уже в приватный список удаляемых объектов. Основной список по-прежднему нетронут.
С удалением это вообще отдельная песня! Если вы решили грохнуть запись, например, в справочнике, вам придется каскадно грохнуть и все записи которые имеют реляцию на эту запись. Подозреваю, что после этого, озверевшие юзвери прийдут всей толпой и оторвут вам все половые признаки. Причем, будут правы.
А если вы каскадно ничего не удалите (ну нет у вас в базе соответствующего тригера, и некому срыгнуть вам ексепшн), то вы нарушите целостность реляционной сруктуры. Проблем поимееете!!!!!!!
Я очень быстро пришел к выводу, что удалять из базы ничего нельзя. Просто запись помечается флажком в булевом поле что она удалена, и больше юзверям не показывается.Представьте такую ситуацию на складе. Вам поставщик перестал поставлять товар с единицами измерения "коробка". Все! Не будет больше коробок никогда! Директор натопал ногами и накричал что он больше не хочет видеть в отчете кучу пустых листов с заголовкам "КОРОБКА". Самое простое решение - удалить такую единицу из справочника. Но при этом у вас обязаны удалиться все записи в которых встречались коробки. Как вы потом баланс по складу сведете без мата и битья ногами в углу склада программиста, я не представляю.
•1. самая очевидная (и проблемная) ситуация: один управляемый объект (объект1) является полем другого объекта (объект2). Менеджер удалил управляемый объект и закоммитил удаление - объект1 уничтожен, но объект2 об этом не знает и при обращении к своему полю (где должен быть объект1) ловит Access Violation. В эту же проблему можно отнести и изменение. Решение которое я вижу - держать объект, в котором регистрируются все изменения, и механизм оповещения - при коммите все заинтересованные менеджеры резвенько подрываются проверять свои управляемые объекты на предмет ошибок
Такого просто не должно происходить! Вопервых, тригер вам не должен дать удалить такую запись. Но если вы таки каскадно удалили запись, у вас и объект1 должен быть удален.
•2. самоорганизация - нужно постоянное помнить, что нельзя менять свойства объекта напрямую, а только через запрашивание копии изменяемого объекта. Можно попробовать решить через упаковывания все обращения к полям в Set и Get методы, с поднятием Exception, если при Set состояние объекта отлично от Commited. Но это приведёт к огромной массе ручного кода, которого-то я и хочу избежать ^_^ В мечтах - система навроде RoR'овских моделей с миграциями и автоматической кодогенерацией. Хотя здесь предупреждают, что кодогенерация - зло, я надеюсь это возможно обернуть всё так, чтобы было мило, изящно и удобно ^_^ ;
Вот это я вааще ни слова не понял
Причем тут кодогенерация? Get да Set. Что может быть проще?
•3. общая хлипкость ^_^ Проблема вполне решаема, но есть ли смысл браться до решения проблемы 1...
Не беритесь. У вас серьезные проблемы в постановке задачи.