|
|
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуйста, делаю простое приложение для работы с БД. Таблица Работник(id,имя,фамилия, должность, филиал) Таблица филиал(id,филиал) Таблица должность(id,должность) Модель соответственно: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Есть интерфейс EmployeeDao и реализация этого интерфейса. Вопрос вот в методе findAll я делаю простой запрос Код: plsql 1. И получаю соответственно 1 Вася Пупкин 1 1 Чтобы вывести непосредственно значения из других таблиц по id как правильно это реализовать? Я вижу два варианта делать отдельно DAO для должности, филиала и в DAO работника держать объекты их. Или сделать просто сложный запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 16:00 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Связать Работника с Филиалом и Должность в Enity @OneToMany ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 16:20 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
-=Koba=-, через JDBC делаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 16:25 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_mscИли сделать просто сложный запрос? делать под VIEW. Если простой просмотр на страничке, то Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 17:10 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_msc-=Koba=-, через JDBC делаю Очень зря. Spring Data + JPA сильно упростят код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 17:13 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczОчень зря. Spring Data + JPA сильно упростят код. Согласен, делаю в качестве обучения, Spring контейнер использую. Цель сделать сначала через JDBC, потом подтянуть ORM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 17:14 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_mscBlazkowiczОчень зря. Spring Data + JPA сильно упростят код. Согласен, делаю в качестве обучения, Spring контейнер использую. Цель сделать сначала через JDBC, потом подтянуть ORM Если ч/з JDBC, то создаете нужный вам запрос, который кладете в POJO класс. Т.е. как бы проблемы совсем нет. Главное знать SQL. После того, как научитесь писать запросы ORM покажется вам смирительной рубашкой. :-) А так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 07:38 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
mad_nazgul, Спасибо, по делу всё. Коллеги, подскажите еще момент. Правильно ли я понимаю можно использовать два подхода 1) JDBC, здесь всю логику отдаём запросам, и классы будут простые 2) JPA, здесь вся логика уходит на классы, маппируем классы на таблицы, и вся основная работа с объектами java происходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 10:35 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_mscПравильно ли я понимаю можно использовать два подхода 1) JDBC, здесь всю логику отдаём запросам, и классы будут простые 2) JPA, здесь вся логика уходит на классы, маппируем классы на таблицы, и вся основная работа с объектами java происходит Нет. JDBC это просто интерфейс работы с БД. Он не диктует где именно вы держите логику, в Java или в БД. Если уж держать логику в БД, то точно не в SQL запросах, запускаемых JDBC, а в хранимых процедурах и функциях, на языке который плохо масштабируется и крайне ограничен. Вы бы это. Фаулера что ли почитали. Enterprise Patterns. Масса подобных вопросов отпала бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 10:42 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсли уж держать логику в БД, то точно не в SQL запросах, запускаемых JDBC, а в хранимых процедурах и функциях, на языке который плохо масштабируется и крайне ограничен.... в неумелых и/или кривых руках. Не могут встроенные возможности СУБД масштабироваться хуже или лучше самой СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 10:52 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВы бы это. Фаулера что ли почитали. Enterprise Patterns. Масса подобных вопросов отпала бы. Спасибо за рекомендацию, обязательно займусь, потому что с пониманием архитектуры есть большие проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:00 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovв неумелых и/или кривых руках. Не могут встроенные возможности СУБД масштабироваться хуже или лучше самой СУБД. Масштабирование данных и выборки и масштабирование рантайма это совсем разные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:02 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, т.е. как посоветовал mad_nazgul это неверно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:03 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_mscт.е. как посоветовал mad_nazgul это неверно? Что именно там не верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:08 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov... в неумелых и/или кривых руках. Не могут встроенные возможности СУБД масштабироваться хуже или лучше самой СУБД. Могут. Не всякая СУБД позволяет во встроенном процедурном ЯП устраивать многопоточные вычисления. А уж о механизме кеширования/инвалидации результатов запросов использующих вызовы определенных пользователем функций обрабатывающие данные внутри СУБД можно забыть почти сразу. Часто использование не SQL ЯП требует еще и дополнительных накладных расходов. Причем часто для доступа к данным из такого ЯП нужно опять задействовать SQL. В общем далеко не серебрянная пуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:14 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЧто именно там не верно? Что один класс вместо трех. И запросом всё пихаем в один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:32 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
mad_nazgulА так: А мне последнее время нравится такое DAO Код: java 1. ну и геттеры и сеттеры. :) плюс универсальный метод чтения (из RowSet)-записи в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:39 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_mscBlazkowiczЧто именно там не верно? Что один класс вместо трех. И запросом всё пихаем в один. Аа. Не заметил сразу. Да. Это не верно. Нет смысла ломать свои бизнес-объекты. Никто не мешает результаты одного запроса разложить по дереву объектов. Запросы это такая штука, которая подвержена изменениям с ростом БД из-за необходимости оптимизаций. Шанс что запрос нужно будет менять - очень велик. Но не будем же мы перепиливать всю модель предметной области из-за этого. Просто модель будет конструироваться иначе. Современные ORM эту проблему решают очень элегантно. Хотим JOIN - получаем JOIN. Хотим несколько SELECT - так и указываем при выборке. Нет необходимости ни менять модель, ни переписывать запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:44 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев Код: java 1. ну и геттеры и сеттеры. :) плюс универсальный метод чтения (из RowSet)-записи в БД. Точно, люто плюсую, т.к. я это делаю уже лет этак 5+ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:45 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевmad_nazgulА так: А мне последнее время нравится такое DAO Код: java 1. ну и геттеры и сеттеры. :) плюс универсальный метод чтения (из RowSet)-записи в БД. Это не DAO. Идея хранить данные в мапах не нова. Но про комбинацию со строго типизироваными свойствами я ещё не слышал. Любопытно было бы посмотреть. Самая большая проблема тут (ИМХО) в том что подобная модель будет совершенно анемичной. Писать логику на Map совсем грустно. Соответсвтенно вы её будете писать снаружи, нарушая инкапсуляцию. Есть и несколько проблем поменьше - это рефакторинг и перенос ряда ошибок из compile time в run time. Интересно было бы посмотреть на то как происходит работа с ассоциациями. В том числе при апдейтах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:02 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, т.е. правильно ли я понимаю: у меня три класса: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Запрос будет такой же как и предложил mad_nazgul но добавятся в выборке position.id , branch.id и уже в RowMapper я создаю три объекта Branch , Position , Employee и заполняю полями из запроса. Так я понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:13 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_mscТак я понимаю? Да. А про jOOQ читали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:16 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДа. А про jOOQ читали? К сожалению нет, сейчас почитаю, Спасибо вам большое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:21 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Blazkowiczslavik_mscТак я понимаю? Да. А про jOOQ читали? А вам хватает бесплатной версии или вы использовали профешнл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:41 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЭто не DAO. Идея хранить данные в мапах не нова. Но про комбинацию со строго типизироваными свойствами я ещё не слышал. Любопытно было бы посмотреть. Самая большая проблема тут (ИМХО) в том что подобная модель будет совершенно анемичной. Писать логику на Map совсем грустно. Соответсвтенно вы её будете писать снаружи, нарушая инкапсуляцию. Есть и несколько проблем поменьше - это рефакторинг и перенос ряда ошибок из compile time в run time. Интересно было бы посмотреть на то как происходит работа с ассоциациями. В том числе при апдейтах. +100500. Уж лучше ActiveRecord в таком случае. Зачем нужен строготипизированный язык если всю логику писать на мапах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:43 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПисать логику на Map совсем грустно. Все зависит от задачи. Построить на экране табличку на мапе - 1 цикл. Сделать ее динамической по настройкам - плевое дело. Добавить поле - даже в код лезть не надо. и т.п. Все тоже самое на геттерах-сеттерах - чистой воды чайна-код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:43 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевBlazkowiczПисать логику на Map совсем грустно. Все зависит от задачи. Построить на экране табличку на мапе - 1 цикл. Сделать ее динамической по настройкам - плевое дело. Добавить поле - даже в код лезть не надо. и т.п. Все тоже самое на геттерах-сеттерах - чистой воды чайна-код. А потом бац и надо поменять customerId(long) на customerUUID(String) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:45 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
забыл никА вам хватает бесплатной версии или вы использовали профешнл? Пользовал QueryDSL, там где лицензии jOOQ не хватало. jOOQ круче. Но, в целом, не моё. Просто был legacy проект с корявым дизайном БД, там ORM был совсем не к месту. Для нормальных ERP систем Hibernate всё ещё рулит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:00 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
забыл ник+100500. Уж лучше ActiveRecord в таком случае. Зачем нужен строготипизированный язык если всю логику писать на мапах? Зависит от подхода, но у меня такая же мысль была. Проще взять любой язык без строгой типизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:01 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевВсе зависит от задачи. Построить на экране табличку на мапе - 1 цикл. Сделать ее динамической по настройкам - плевое дело. Добавить поле - даже в код лезть не надо. и т.п. Все тоже самое на геттерах-сеттерах - чистой воды чайна-код. Это всё замечательно до тех пор пока нам не понадобится в эти таблички интегрировать бизнес-логику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:02 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
забыл никА потом бац и надо поменять customerId(long) на customerUUID(String) :) Так в том то и дело, что в описании и будет Что-то типа было Код: javascript 1. стало Код: javascript 1. и клиентская часть рисующая табличку отображает другой столбец. В случае, если надо менять запрос, конечно все сложнее. Но в случае геттеров-сеттеров надо гарантированно перепахивать больше кода. Собственно геттеры-сеттеры в любом случае скрывают способ хранения property. Хранить их в map немного увеличивает накладные ресурсу, но добавляет гибкости. И избавляет от кучи кода (Даже если он весь в @) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:03 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЭто всё замечательно до тех пор пока нам не понадобится в эти таблички интегрировать бизнес-логику. Надо - геттеры и сеттеры к твоим услугам, тыж поди все одно поля public не делаешь? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:05 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньеви клиентская часть рисующая табличку отображает другой столбец. И чем это отличается от аннотаций? Кроме того что существенно увеличивает трудности с relations и всякими join? Далее проблемы со всякими лэйзи-лоадинг и кешированием... Если не нравятся геттеры - то есть Lombok в конце концов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:38 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевНадо - геттеры и сеттеры к твоим услугам, тыж поди все одно поля public не делаешь? :) Я делаю методы, которые работают с полями, а не геттерами-сеттерами. Это называется ООП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:50 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЯ делаю методы, которые работают с полями, а не геттерами-сеттерами. Это называется ООП. Возможность методов работать с другими методами - тоже часть ООП. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 14:08 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
забыл никИ чем это отличается от аннотаций? Кроме того что существенно увеличивает трудности с relations и всякими join? Этот подход (хранить в map, а не в полях класса) не создает никаких трудностей ни с join ни с другими relations. Ибо можно скормить хоть тому же Hibernate если очень захочется (ему собственно по барабану). Или самому написать запрос любой сложности. А аннотации требуют а- изменения кода, а так внешний вид формы можно хранить хоть в табличке и запоминать, какой пользователь какие поля скрыл, какие растянул, в каком порядке переставил и т.п. Более того, в отличии от аннотаций его не так сложно отправить на клиента, если там скажем javascript. Если же говорить про подход делать мапирование нескольких сущностей БД в одну POJO, то есть как плюсы, так и минусы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 14:15 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевBlazkowiczЯ делаю методы, которые работают с полями, а не геттерами-сеттерами. Это называется ООП. Возможность методов работать с другими методами - тоже часть ООП. :) Ну, если у вас большинство акцессоров приватные, тогда ладно. В принципе, если знать о проблеме, то можно её избежать. Тогда единственным минусом остаётся слегка уродливый код на акцессорах. Методы, которые работают с полями, обычно, более лаконичны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 14:15 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
BlazkowiczМетоды, которые работают с полями, обычно, более лаконичны. Так я и писал - зависит от задачи. Если надо обрабатывать сразу группу полей, то проще их в map загнать. (будет как раз лакониченее) Если по одному - каждое в отдельное поле. И то и другое - getter и map. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 15:07 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_mscт.е. правильно ли я понимаю: у меня три класса: что вы так в классы упёрлись? Если у вас на клиенте будет большая простыня сводных данных, то нафиг вам эти 3 класса? Без связки БД-->БЛ-->ГУИ нет смысла говорить о количестве классов. - делайте ОДНУ страничку VIEW-ГУИ. И под табличку в ГУИ(возможно JSON) будете делать свои классы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 17:07 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Petro123что вы так в классы упёрлись? Если у вас на клиенте будет большая простыня сводных данных, то нафиг вам эти 3 класса? Без связки БД-->БЛ-->ГУИ нет смысла говорить о количестве классов. - делайте ОДНУ страничку VIEW-ГУИ. И под табличку в ГУИ(возможно JSON) будете делать свои классы. Уперся потому что хочу сделать нормально. Простыня не такая уж и длинная. Вот и пытаюсь связать БД->БЛ->ГУИ. Стараюсь сделать слоенный пирог, в основе которого Spring MVC, сейчас использую spring-jdbc, позже когда всё заработает добавлю ORM. Еще позже добавлю Spring Security. А там может еще чего то, поэтому стараюсь делать правильно, чтобы можно было масштабировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 17:40 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
slavik_mscУперся потому что хочу сделать нормально. ну тогда тут нет темы для обсуждения на 2 страницы. - академически правильно в DAO - все таблицы представить объектами. Сколько таблиц - столько классов. Т.е. DAO убирает и маскирует СУБД. Берёшь и делаешь свой Helo World из 3-х таблиц как положено. После того как будет готово, можно посомневаться ... Не повторяйте DAO! http://www.ibm.com/developerworks/ru/library/j-genericdao/ Это только пример того что надо всё пробовать самому). Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 20:49 |
|
||
|
Архитектура DAO
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуйста, я к каждому классу который соответствует своей таблице в БД, делаю слой DAO и слой сервиса. И итоге есть класс который использует много объектов других классов, я могу использовать в слое DAO этого класса сервисы других классов? Насколько правильно так делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 21:19 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2123267]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 391ms |

| 0 / 0 |
