Когда я был молодой, мне поручили написать важную хрень, и я начал писать, и написал. Мы использовали embedded-базу (если интересно - neo4j), и я тогда плевался от паттернов, поэтому сейчас по всему проекту иногда сквозь все слои абстракции прорывается низкоуровненая хрень.
Есть один класс-менеджер, который отвечает за инициализацию/конфигурирование базы и индексов. Из него наружу торчат методы для создания классов, которые оборачивают сущности базы и позволяют сверху налепливать свою логику. (делал тогда еще по этому ману: http://neo4j.com/docs/stable/tutorials-java-embedded-entities.html), оказалось, что зря.
Еще такая особенность - база вся дофига ACID, поэтому все операции нужно оборачивать в транзакции (которые никак особо не упрятать), а также все сущности (их там, грубо говоря, два типа) - ноды (вершины) и отношения (ребра) содержат ссылки на инстансы базы, которая их породила.
Если база падает, можно ее перезапустить и все будет в порядке, казалось бы, но! Поскольку каждый наш объект внутри держит какой-то примитив базы, после перезапуска эти примитивы будут ссылаться на старую базу, и, соответственно, весь перезапуск бесполезен.
Теперь я рву на себе волосы от отчаяния и пытаюсь подумать, как бы переписать это так, чтобы реинициализация базы влекла за собой каким-то образом «освежение» ссылок на ее инстанс. (Просто подменить на лету ссылку не катит, да.)
Можно было бы сделать все на исключениях (типа словить что-то в стиле «БазаВыключенаИсключение» и отрефрешить объект), но из-за того, что нет единой точки оперирования хренями, пришлось бы это совать всюду, где может быть взаимодействие с примитивами базы.
Прямо-таки уверен, что у нормальных пацанов есть нормальные решения. В этом треде можно меня говнить, но хотелось бы потом что-то увидеть полезное.