Определение DAO интерфейсов для агрегата

Доброго времени суток.

Задача: Имеется следующая схема БД

введите сюда описание изображения

и следующая структура классов введите сюда описание изображения

Необходимо разработать DAO интерфейс или интерфейсы для агрегата, корнем которого является класс Product. Взаимодействие с БД осуществляется с помощью JDBC. ORM использовать нельзя.

Что не получается: Я не могу понять, как должен выглядеть правильный DAO интерфейс/интерфейсы для описанной модели. Я придерживался следующих принципов, хотя теперь у меня нет никакой уверенности, что они правильные:

  1. Для каждого класса бизнес модели свой интерфейс. (У меня получились соответствующие интерфейсы - ProductTagDao, ProductPriceDao, ProductDao и их реализации).
  2. Объекты каждого типа бизнес логики могут быть загружены, сохранены или удалены из БД только через соответствующий интерфейс.
  3. Интерфейсы DAO по возможности максимально "тупы" и предоставляют элементарные CRUD операции и их простые модификации.

Вот что получилось в итоге:

  public interface ProductTagDao {
      /**
      * Возвращает теги для выборки продуктов из всех продуктов отсортированных по имени. Выборка начинается с продукта под номером fromIndex                                                            
      * (первый продукт имеет номер 0), кол-во продуктов в выборке равно count. Теги возвращаются в виде коллекции HashMap, где ключами выступают
      * идентификаторы тегов.
      *
      * @param fromIndex - номер продукта из списка всех продуктов отсортированных по имени, с которого начинается выборка продуктов.
      * @param count - кол-во продуктов входящих в выборку из всех продуктов отсортированных по имени. 
      * 
      */
      public HashMap<Integer, ProductTag> getTagsByProductsSortedByName(
             int fromIndex, int count) throws SQLException;

      /**
      * Возвращает все теги для продукта с id равном productId. Теги возвращаются в виде коллекции HashMap, где ключами выступают идентификаторы 
      * тегов.
      *
      * @param productId - идентификатор продукта, для которого возвращаются все принадлежащие ему теги. 
      */
      public HashMap<Integer, ProductTag> getTagsByProductid(int productId) throws SQLException;

      public void add(ProductTag tag) throws SQLException;
      public void update(ProductTag tag) throws SQLException;
      public void removeById(int tagId) throws SQLException;
  }


  public interface ProductPriceDao {
      /**
      * Возвращает цены для выборки продуктов из всех продуктов отсортированных по имени. Выборка начинается с продукта под номером fromIndex                                                            
      * (первый продукт имеет номер 0), кол-во продуктов в выборке равно count. Цены возвращаются в виде коллекции HashMap, где ключами 
      * выступают идентификаторы цен.
      *
      * @param fromIndex - номер продукта из списка всех продуктов отсортированных по имени, с которого начинается выборка продуктов.
      * @param count - кол-во продуктов входящих в выборку из всех продуктов отсортированных по имени. 
      * @tags - коллекция всех тегов, которые понадобятся для всех объектов ProductPrice возвращаемых данным методом.
      */
      public HashMap<Integer, ProductPrice> getPricesByProductsSortedByName(
             int fromIndex, int count, HashMap<Integer, ProductTag> tags) throws SQLException;

      /**
      * Возвращает цены для продукта с id равном productId. Цены возвращаются в виде коллекции HashMap, где ключами 
      * выступают идентификаторы цен.
      *
      * @param productId - идентификатор продукта, для которого возвращаются все принадлежащие ему теги. 
      * @tags - коллекция всех тегов, которые понадобятся для всех объектов ProductPrice возвращаемых данным методом.
      */
      public HashMap<Integer, ProductPrice> getPricesByProductId(
             int productId, HashMap<Integer, ProductTag> tags) throws SQLException;

      public ProductPrice add(ProductPrice price) throws SQLException;
      public void update(ProductPrice price) throws SQLException;
      public void removeById(int id) throws SQLException;

      public void addTag(int productId, ProductTag tag) throws SQLException;
      public void removeTag(int productId, ProductTag tag) throws SQLException
  }


  public interface ProductDao {
      /**
      * Возвращает продукт по его идентификатору.
      *
      * @param id - идентификатор возвращаемого продукта.
      * @param prices - коллекция всех цен, которые понадобятся для возвращаемого объекта Product.
      */
      public Product getById(
            int id, HashMap<Integer, ProductPrice> prices) throws SQLException;

      /**
      * Возвращает выборку из списка всех продуктов отсортированных по имени, начиная с продукта под номером fromIndex 
      * (первый продукт имеет номер 0) в колличестве равном count.
      *
      * @param fromIndex - номер продукта из списка всех продуктов отсортированных по имени, с которого начинается выборка продуктов.
      * @param count - кол-во продуктов входящих в выборку из всех продуктов отсортированных по имени.
      * @param prices - коллекция всех цен, которые понадобятся для всех возвращаемых объектов Product.
      */
      public List<Product> getSortedByName(
            int fromIndex, int count, HashMap<Integer, ProductPrice> prices) throws SQLException;

      public Product add(Product product) throws SQLException;
      public void update(Product product) throws SQLException;
      public void removeById(int id) throws SQLException;

      public void addPrice(int productId, ProductPrice price) throws SQLException;
      public void removePrice(int productId, ProductPrice price) throws SQLException; 

      public void addTag(int productId, ProductTag tag) throws SQLException;
      public void removeTag(int productId, ProductTag tag) throws SQLException;
  }
      

Агрегат собирается в отдельном классе играющем роль сервиса:

public class NutritionManager {
     //какой-то код

     public Product getProductById(int id) throws Exception {
          HashMap<Integer, ProductTag> tags = productTagDao.getTagsByProductid(id);
          HashMap<Integer, ProductPrice> prices = productPriceDao.getPricesByProductId(id, tags);
          return productDao.getById(id, prices);
     }
}

В чем нужна помощь: пожалуйста, покритикуйте мое решение поставленной задачи и/или предложите свое решение.


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