Загрузка графа объектов

Задача: Есть класс А и класс В:

public final class A {
    private final int ID;
    private final String VALUE;
    private final B OBJECT_B;

    //... конструктор и методы
}

public class B {
    private int id;
    private String value;

    //... конструктор и методы
}

Необходимо определить архитектурный подход для загрузки объектов обоих типов из реляционной СУБД без использования ORM, с учетом следующего:

  1. Между сущностями типов А и В установлено отношение один-ко-многим (на объект/запись типа/таблицы В может ссылаться на несколько объектов/записей типа/таблицы А).
  2. Необходимо избегать проблемы N + 1 (обращение к СУБД производится удалено и объектов много)
  3. Объекты типа А неизменяемы и как следствие - поле OBJECT_B должно быть проинициализированно в момент конструирования.
  4. Объекты класса А и В могут загружаться и обрабатываться по отдельности (поле OBJECT_B у объектов типа А может иметь значение null). Поэтому для них имеются отдельные таблицы связанные через foreighn key.
  5. Загрузка и сохранение объектов осуществляется с использованием паттерна DAO.
  6. Граф объектов ацикличен, глубина не больше двух, объекты одного и того же типа не ссылаются друг на друга.

Как я пытался решить задачу: На данный момент нашел простое решение "в лоб". Есть некий менеджер всех объектов. Он хранит закешированные объекты после выборок в ассоциативных массивах. Он же и отвечает за обращение к СУБД через DAO. DAO интерфейс для класса А будет выглядеть примерно во так

public interface ADao {
    public void add(A a) throws Exception;
    public void delete(A a) throws Exception;
    public void update(A a) throws Exception;
    public A getA(int id, Map<Integer,B> bObjects) throws Exception;
    public List<A> getAll(Map<Integer,B> bObjects) throws Exception;

}

Вопрос: существуют ли какие-нибудь best-practis для решения подобных задач?


Ответы (0 шт):