Форум программистов, компьютерный форум, киберфорум
Java: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 105
1

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

25.12.2020, 08:27. Показов 1234. Ответов 6

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

Задача: Имеется следующая схема БД
Определение DAO интерфейсов для агрегата


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


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

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

Вот что получилось в итоге:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     public interface ProductDao {
          public Product getById(
                int id, HashMap<Integer, ProductPrice> prices) throws Exception;
          public List<Product> getSortedByName(
                int fromIndex, int count, HashMap<Integer, ProductPrice> prices) throws Exception;
 
          public Product add(Product product) throws Exception;
          public void update(Product product) throws Exception;
          public void removeById(int id) throws Exception;
 
          public void addPrice(int productId, ProductPrice price) throws Exception;
          public void removePrice(int productId, ProductPrice price) throws Exceprion; 
 
          public void addTag(int productId, ProductTag tag) throws Exception;
          public void removeTag(int productId, ProductTag tag) throws Exception;
      }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
     public interface ProductPriceDao {
          public HashMap<Integer, ProductPrice> getPricesByProductsSortedByName(
                 int fromIndex, int count, HashMap<Integer, ProductTag> tags) throws Exception;
          public HashMap<Integer, ProductPrice> getPricesByProductId(
                 int productId, HashMap<Integer, ProductTag> tags) throws Exception;
 
          public ProductPrice add(ProductPrice price) throws Exception;
          public void update(ProductPrice price) throws Exception;
          public void removeById(int id) throws Exception;
 
          public void addTag(int productId, ProductTag tag) throws Exception;
          public void removeTag(int productId, ProductTag tag) throws Exceptio
      }
Java
1
2
3
4
5
6
7
8
9
      public interface ProductTagDao {
          public HashMap<Integer, ProductTag> getTagsByProductsSortedByName(
                 int fromIndex, int count) throws Exception;
          public HashMap<Integer, ProductTag> getTagsByProductid(int productId) throws Exception;
 
          public void add(ProductTag tag) throws Exception;
          public void update(ProductTag tag) throws Exception;
          public void removeById(int tagId) throws Exception;
      }
Агрегат собирается в отдельном классе играющем роль сервиса по следующему принципу:
Java
1
2
3
4
5
6
7
8
9
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2020, 08:27
Ответы с готовыми решениями:

Кондиционер Timberk AC TIM 30H S18A, Ищу сервисную доку для этого агрегата
Задумал поставить у себя в мастерской кондиционер, завтра обещали притащить Timberk AC TIM 30H S18A...

Разработка интерфейсов, использование механизма наследования интерфейсов и применение их в программах
Имеется код, необходимо реализовать, и протестировать эти интерфейсы IComparable (сравнимый),...

NextRecordset для DAO
Знатоки!!!! Подскажите плиззз кто знает, как использовать nextrecordset для DAO.Recordset в MS...

nextrecordset для DAO (Access)
Знатоки!!!! Подскажите плиззз кто знает, как использовать nextrecordset для DAO.Recordset в MS...

6
Эксперт Java
3049 / 2544 / 782
Регистрация: 05.07.2013
Сообщений: 12,308
25.12.2020, 08:38 2
Что за throws Exception? Кто научил так делать?
Или вот метод назван getPricesByProducts, передаются какие то хэшмапы, fromIndex, что это всего такое?
0
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 105
25.12.2020, 08:48  [ТС] 3
Что за throws Exception? Кто научил так делать?
Выбрасывается по сути SQLExcrption. Я хотел дать возможность вызывающему коду самостоятельно решать что делать, если при обращении к БД Что-то пошло не так (например, мне кажется плохой идеей вести логирование ошибок на уровне Data Access Layer). Возможно вы имели ввиду использовать более узкий тип исключения?
0
Эксперт Java
3049 / 2544 / 782
Регистрация: 05.07.2013
Сообщений: 12,308
25.12.2020, 08:57 4
Более узкий, либо вообще сделай свой тип Runtime Exception

Добавлено через 32 секунды
И throws убери соответственно
0
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 105
25.12.2020, 09:20  [ТС] 5
Или вот метод назван getPricesByProducts, передаются какие то хэшмапы, fromIndex, что это всего такое?
Я не хотел перегружать свой вопрос, но если это поможет понять код, я добавлю комментарии к каждому методу.

Добавлено через 20 минут
Или вот метод назван getPricesByProducts, передаются какие то хэшмапы, fromIndex, что это всего такое?
Добавил комментарии к к некоторым методам чтобы прояснить ваш вопрос. Также изменил тип выбрасываемых исключений на более узкий.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      public interface ProductTagDao {
          /**
          * Возвращает теги для всех продуктов отсортированных по имени начиная с продукта под номером fromIndex (первый 
          * продукт имеет номер 0) в колличестве равном count. Теги возвращаются в виде коллекции HashMap, где ключами 
          * выступают их идентификаторы.
          */
          public HashMap<Integer, ProductTag> getTagsByProductsSortedByName(
                 int fromIndex, int count) throws SQLException;
 
          /**
          * Возвращает все теги для продукта с id равном productId. Теги возвращаются в виде коллекции HashMap, где ключами 
          * выступают их идентификаторы.
          */
          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;
      }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
     public interface ProductPriceDao {
          /**
          * Возвращает цены для всех продуктов отсортированных  по имени начиная с продукта под номером fromIndex (первый 
          * продукт имеет номер 0) в колличестве равном count. Цены возвращаются в виде коллекции HashMap, где ключами 
          * выступают их идентификаторы.
          */
          public HashMap<Integer, ProductPrice> getPricesByProductsSortedByName(
                 int fromIndex, int count, HashMap<Integer, ProductTag> tags) throws SQLException;
 
          /**
          * Возвращает цены для продукта с id равном productId. Цены возвращаются в виде коллекции HashMap, где ключами 
          * выступают их идентификаторы.
          */
          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
      }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     public interface ProductDao {
          public Product getById(
                int id, HashMap<Integer, ProductPrice> prices) throws SQLException;
 
          /**
          * Возвращает выборку из списка всех продуктов отсортированных по имени, начиная с продукта под номером fromIndex 
          * (первый продукт имеет номер 0) в колличестве равном count.
          */
          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;
      }
0
Эксперт Java
3049 / 2544 / 782
Регистрация: 05.07.2013
Сообщений: 12,308
25.12.2020, 09:28 6
Цитата Сообщение от Bakuard Посмотреть сообщение
/**
          * Возвращает цены для всех продуктов отсортированных  по имени начиная с продукта под номером fromIndex (первый
          * продукт имеет номер 0) в колличестве равном count. Цены возвращаются в виде коллекции HashMap, где ключами
          * выступают их идентификаторы.
          */
          public HashMap<Integer, ProductPrice> getPricesByProductsSortedByName(
                 int fromIndex, int count, HashMap<Integer, ProductTag> tags) throws SQLException;
так зачем мне передавать в метод какой-то хэшмэп? Вот я смотрю на сигнатуру и ваще не понимаю, что должен делать этот метод и что мне нужно туда передавать.
0
0 / 0 / 1
Регистрация: 25.12.2016
Сообщений: 105
25.12.2020, 09:57  [ТС] 7
так зачем мне передавать в метод какой-то хэшмэп? Вот я смотрю на сигнатуру и ваще не понимаю, что должен делать этот метод и что мне нужно туда передавать.
Добавил больше подробностей в javadoc

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
      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;
      }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     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
      }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
     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;
      }
Добавлено через 22 секунды
так зачем мне передавать в метод какой-то хэшмэп? Вот я смотрю на сигнатуру и ваще не понимаю, что должен делать этот метод и что мне нужно туда передавать.
Добавил больше подробностей в javadoc

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
      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;
      }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     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
      }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
     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;
      }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2020, 09:57

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Junit test для DAO класса
Делаю junit тест для DAO. вылетает ексепшн Could not autowire field: private...

Реализация DAO для нескольких сущностей
Доброго времени суток! Вопрос быть может банальный, но... Имеется некоторый абстрактный сайт на...

Агрегат от агрегата
Добрый день, товарищи. Подскажите пожалуйста вот по какому вопросу. Предположим есть...

Best practices DAO-класса для JDBC и JPA
Доброго времени суток, свои простенькие DAO-реализации я писал, так вот подумал, что надо бы узнать...

Моделирование насосного агрегата
Суть такова: Есть насосная установка, сама структурная схема состоит из электроприводной и насоса....

Моделирование насосного агрегата
Здравствуйте! Собирал схему для моделирования работы насоса на станции первого подъема....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.