Определение DAO интерфейсов для агрегата
Доброго времени суток.
Задача: Имеется следующая схема БД
Необходимо разработать DAO интерфейс или интерфейсы для агрегата, корнем которого является класс Product. Взаимодействие с БД осуществляется с помощью JDBC. ORM использовать нельзя.
Что не получается: Я не могу понять, как должен выглядеть правильный DAO интерфейс/интерфейсы для описанной модели. Я придерживался следующих принципов, хотя теперь у меня нет никакой уверенности, что они правильные:
- Для каждого класса бизнес модели свой интерфейс. (У меня получились соответствующие интерфейсы - ProductTagDao, ProductPriceDao, ProductDao и их реализации).
- Объекты каждого типа бизнес логики могут быть загружены, сохранены или удалены из БД только через соответствующий интерфейс.
- Интерфейсы 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);
}
}
В чем нужна помощь: пожалуйста, покритикуйте мое решение поставленной задачи и/или предложите свое решение.

