В вашем примере вы используете методы, которые локализованы для типа DAO, лучше определить согласованный набор методов DAO для этих функций, т.е.
// load object of DAO type T
<T> load(id)
// load objects of DAO type T
List<T> load(List<id>)
// load all objects of DAO type T
List<T> find()
// load multiple objects of DAO type T
List<T> find(relation)
и т. Д., Если вы используете согласованный тип id
(например, long
), вы можете определить interface
, охватывающий ваши базовые методы.
Чтобы загрузить отношения, у вас есть несколько вариантов, которые лучше всего зависят от вашего использования объектов и их отношений:
- сделать
List<T>
атрибутом держателя данных и заполнить его как часть load()
Это работает для небольшого количества отношений, когда связанные объекты не имеют отношений с другими объектами. Если это произойдет, вам придется частично загрузить их, чтобы предотвратить чрезмерную загрузку (отложенная загрузка, как вы упомянули, является стратегией.)
- сделать
List<T_id>
атрибутом держателя данных и заполнить его как часть load()
Это работает для умеренного количества отношений, используемых вместе с load(List<id>)
методами для доступа к связанным сущностям.
Для больших объемов данных, поскольку вы упоминаете, что это основная часть проблемы, которую вы пытаетесь решить, вы можете разделить отношения немного дальше и использовать методы DAO, такие как:
// retrieve related entity id's for this DAO T
List<id> loadIds(T)
для загрузки набора (чужих) id
для сущностей, которые имеют отношение к объекту-держателю данных, переданному в качестве аргумента. Ваш уровень менеджера / бизнеса / обслуживания затем использует этот список идентификаторов для загрузки следующего набора сущностей, возможно, разделенных на части путем передачи смещения в список идентификаторов и количества загружаемых сущностей.
В качестве альтернативы вы можете отделить знания об отношениях, добавив методы DAO для заполнения внешних отношений в объекте-держателе данных другого типа DAO:
// fill entity relations for T2 to this DAO tyoe T
void fill(T2)
Метод T::fill()
будет использовать геттеры на T2
для получения данных, необходимых для определения связанных сущностей (или их id
) для загрузки, и один или несколько сеттеров для хранения этой информации в T2
объект держателя данных.
Методы загрузки большинства этих DAO оставляют реляционные данные равными null
, оставляя их для последующей загрузки. Это, конечно, означает, что их получатели объекта-держателя данных должны иметь возможность обрабатывать значения null
как часть контракта.