Классическим вариантом реализации слоя сохранения сосотяния приложения (Persistence layers) является ORM, все достоинства и недостатки которых давно известны и многократно описаны например у Мартина Фаулера. Если кратко, основная проблема использования ORM состоит в том, что объекты в ООП описывают поведение некоторых сущностей, а ORM пытается работать с данными внутри этих сущностей. Однако ORM не имеет информации о том, какая часть полей класса является состоянием сущности которое надо сохранять, и для добавления этой информации приходится каким либо образом помечать эти поля, либо описывать специфику сохранения и восстановления отдельно в коде. Ну и конечно очень часто возникает ситуация неправильного использования ORM из-за непонимания их специфики и универсального характера реализации.
Что может быть альтернативой ORM? Можно взнглянуть на проблему под другим углом: если попытка срастить произвольную объектную модель и реляционное представление данных из этой модели в базе очевидным образом приводят к сложностям, можно ограничить область использования этого инструмента. Часто подобная попытка ограничения приводит к тому что из объектов реализующих сущности предметной области выкидывается все поведение и остается только структура данных представляющих собой анемичную модель предметной области, что так-же является плохой практикой проектирования ПО.
Мне видится наиболее подходящим решением этих проблем логичное, хотя и не столь очевидное, явное отделение состояния сущностей предметной области от их поведения и вспомогательных полей, что можно делать в виде отдельных объектов состояний агрегированных в сущности. Когда состояние явно таким образом определено, его сохранение (а точнее сохранение всего дерева состояний корня агрегации и вложенных сущностей) является простой технической задачей и может быть реализована в виде отдельной универсальной библиотеки (или пакета) с возможностью менять тип хранилища будь то SQL база данных или NoSQL хранилище либо что-то совсем иное.
Таким образом, реализация слоя сохранения сосотяния приложения может представлять собой некоторый класс StateStore который может быть тонкой оберткой над каким либо ORM, явно отделяя состояние приложения от всего остального.