|
|
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
javapeckerто что транзакции сами это круто, но у вас методы дао транзакционные, так что принципиальной разницы с первым вариантом нет, и главная проблема осталась Дефолтный Propagation=REQUIRED, а это значит, что используется внешняя транзакция, если она есть. Поэтому эти методы могут работать как в одной общей транзкации так и в собственной единственной. javapeckerИ если нужно только автоматическое управление транзакциями, достаточно использовать динамик прокси, и не таскать за собой спринг ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 20:27:15 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТаки без копипаста вообще никак? sessionFactory.getCurrentSession() стоило оформить в отдельный метод. Инкапсуляция наше всё.А на кой выводить в отдельный метод? Только чтобы букав было чуть-чуть меньше? Если в одном методе встречается два и более обращения, то использую уже переменную. А в чем профит этого приватного метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 20:41:05 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Дефолтный Propagation=REQUIRED, а это значит, что используется внешняя транзакция, если она есть красота, я думал там просто все, раз @transactional, значит в транзакции ? Если все что нужно получить, это управление транзакциями, можно сделать динамический прокси, который будет перехватывать методы бизнес уровня и оборачивать их в транзакции. При этом спринг или возможности EE не понадобятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 20:42:05 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
javapeckerЕсли все что нужно получить, это управление транзакциями, можно сделать динамический прокси, который будет перехватывать методы бизнес уровня и оборачивать их в транзакции. При этом спринг или возможности EE не понадобятся. Если вспомнить про такие вещи как Propagation, Isolation, JTA/XA то писать свой велосипед уже не захочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2013, 20:45:15 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruckBlazkowiczТаки без копипаста вообще никак? sessionFactory.getCurrentSession() стоило оформить в отдельный метод. Инкапсуляция наше всё.А на кой выводить в отдельный метод? Только чтобы букав было чуть-чуть меньше? Если в одном методе встречается два и более обращения, то использую уже переменную. А в чем профит этого приватного метода? В том что это инфраструктура, которая не решает бизнес-задачи и имеет тенденцию меняться\разраться\забываться\дополняться. Это просто инкапсуляция и этим все сказано. В этом случае некритично, но очевидно что чем аккуратнее код, тем лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 00:45:22 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
Или я чего-то не понимаю, или прав ... Для "красоты" предлагается сделать приватную функцию типа Код: java 1. 2. 3. Так? В этом случае при каждой необходимости получить сессию надо дергать фабрику? Чем это лучше, чем получить приватную переменную типа Session в методе и пользоватья ею? Или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 01:16:34 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruckИли я чего-то не понимаю, или прав ... Для "красоты" предлагается сделать приватную функцию типа Почему приватную? protected. Мы ведь родительский класс пишем. IDVsbruckТак? В этом случае при каждой необходимости получить сессию надо дергать фабрику? И? IDVsbruckЧем это лучше, чем получить приватную переменную типа Session в методе и пользоватья ею? Или я ошибаюсь? Переменная в многопоточном окружении как себя вести будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 01:32:35 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
Н-да, за многопоточность я не подумал. Но это сразу толкает на мысль: если в методе более одной строки с зависимым кодом, то сразу ставить synchronized? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 13:22:02 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruckболее одной строки с зависимым кодом Что такое "зависимый код"?? IDVsbruck, то сразу ставить synchronized? synchronized это убийца производительности сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 13:26:32 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЧто такое "зависимый код"?? Ну, навскидку: в pojo есть поле (поля), помеченные как @Transient, для удобства использования в сервисах и представлениях, которые заполняются в DAO (Repository). Механизм заполнения простой: строка 1 - получение сущности, строка 2 - получение объекта или набора объектов, используя данные объекта из строки 1, строка 3 - заполнение Transient-поля объекта полученными объектами из строки 2. Получается, для высоконагруженного приложения чревато подобное использование? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 14:14:49 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, Няня, я у них поел. Но, судя по описанию, это и есть пример Anemic Model. Не понятно с какого перепугу DAO заполняет вычислимые поля сущностей. Если сущности сами могут вычислять значения, имея ссылки на остальные сущности. Ну, и намешали всё в кучу. POJO тут вообще не при чем. Класс со свойствами называется Bean. Bean, который хранится в базе это Entity. POJO - вообще не о том. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 14:22:24 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
Да ладно, пусть не POJO, пусть просто объект-сущность. Так как поступать в описанной ситуации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 20:59:12 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruckДа ладно, пусть не POJO, пусть просто объект-сущность. Так как поступать в описанной ситуации? DAO вычитывает связаные объекты. DAO ничего не вычисляет. Вычислимые свойства сущности считают сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 21:22:52 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
Я не спорю. Просто ты затронул очень важный момент, на котором я не особо акцентировался. И привел схожий пример, когда надо заполнить Transient-поле бина-сущности данными, которые не обязательно должны быть заполнены (при вызове метода указываю флаг для указания - нужно ли заполнять поля - для снижения нагрузки, когда такие поля не нужны). Считать самим свои поля, как ты говоришь, - не совсем понятно, так как в методы бина не засунешь вычитку из базы - модель есть модель и засорять сервисными функциями неправильно. Делать раздельные сервисы - хрен с ними, можно и сделать, но проблему это не решит: запросом я получаю бин, следующей строкой кода вызываю метод другого сервиса - уже угроза использования разными потоками. Отсюда и вопрос: как действительно правильно идеологически и функционально реализовать подобные "нюансы"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 22:33:38 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruckЯ не спорю. Просто ты затронул очень важный момент, на котором я не особо акцентировался. И привел схожий пример, когда надо заполнить Transient-поле бина-сущности данными, которые не обязательно должны быть заполнены (при вызове метода указываю флаг для указания - нужно ли заполнять поля - для снижения нагрузки, когда такие поля не нужны). Считать самим свои поля, как ты говоришь, - не совсем понятно, так как в методы бина не засунешь вычитку из базы - модель есть модель и засорять сервисными функциями неправильно. Делать раздельные сервисы - хрен с ними, можно и сделать, но проблему это не решит: запросом я получаю бин, следующей строкой кода вызываю метод другого сервиса - уже угроза использования разными потоками. Отсюда и вопрос: как действительно правильно идеологически и функционально реализовать подобные "нюансы"? У вас похоже смешались кони, люди.. Вы точно не путаете transient и lazy? transient - это поле которое можно не сериализовать и вычислить на основе других полей, зачем вам лезть в базу? Вы рассматриваете абсолютно anemic domain model. В варианте предложенном Blazkowicz, модель сама знает что она частино неинициализирована и обрабатывает это сама. как вариант в каждом геттере для transient поля вызывать init() и т.д. А вот если вы имеете ввиду lazy, то тут да, есть определенные сложности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 22:52:22 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruckЯ не спорю. Просто ты затронул очень важный момент, на котором я не особо акцентировался. И привел схожий пример, когда надо заполнить Transient-поле бина-сущности данными, которые не обязательно должны быть заполнены (при вызове метода указываю флаг для указания - нужно ли заполнять поля - для снижения нагрузки, когда такие поля не нужны). Считать самим свои поля, как ты говоришь, - не совсем понятно, так как в методы бина не засунешь вычитку из базы - модель есть модель и засорять сервисными функциями неправильно. Делать раздельные сервисы - хрен с ними, можно и сделать, но проблему это не решит: запросом я получаю бин, следующей строкой кода вызываю метод другого сервиса - уже угроза использования разными потоками. Отсюда и вопрос: как действительно правильно идеологически и функционально реализовать подобные "нюансы"? Покажи уже пример. Строить модель по твоим туманным подсказкам достаточно не просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 22:59:08 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
Код: 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. Вот, накидал на скорую руку. К примеру, нечто такое ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2013, 23:36:07 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, Смотри. Тут возможны, как минимум, три варианта. 1) Entity и AnotherEntity вообще никак не связаны. Что уже подозрительно, как так получилось, что в Java они связаны, а в базе нет? Ты смело выкинул важный кусок из примера "FROM OtherEntity otherEntity WHERE ...", который показывает как именно связаны в базе. Hibernate умеет связывать даже по свойствам, если полноценных FK в базе нет. То есть этот случай как минимум подозрительный. Но если так, то выходит что мы просто засунули бизнес-логику в Repository, тогда как место ей в TransactionScript. Код: java 1. 2. 3. 2) Зачем нам @Transient свойство, если у нас коллекции и так по-умолчанию Lazy?? Чем этот код отличается от твоего, не очень понятно. Код: java 1. 2. 3. 4. 3) Твой код немного смахивает на управление Dynamic Association Fetching: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-dynamicfetching То есть он имеет право на жизнь, когда нужно управлять Join/Sub-select/Lazy. Но для него есть готовый API, ты указываешь имя свойства и каким образом ты его хочешь грузить в текущем сценарии. API для этого уже есть. Реализовывать его самостоятельно особо не за чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 10:14:01 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
Ну да, пример не очень удачный, действительно тут все можно заменить на Lazy. Тогда подойду с другой стороны: скажем, удаление аккаунта пользователя ... в базе как минимум 8-10 таблиц так или иначе ссылаются на сущность, причем, некоторые имеют FK на уровне базы, другие нет (тут вижу замечание, что надо связать на уровне базы, но не хочу - слишком много завязано). Поэтому удаление делаю пошагово: запросами удаляю "слабо-зависимые" сущности, затем основную. В любом случае, это несколько строк. Как обезопаситься при многопоточном обращении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 13:02:15 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruckНу да, пример не очень удачный, действительно тут все можно заменить на Lazy. Тогда подойду с другой стороны: скажем, удаление аккаунта пользователя ... в базе как минимум 8-10 таблиц так или иначе ссылаются на сущность, причем, некоторые имеют FK на уровне базы, другие нет (тут вижу замечание, что надо связать на уровне базы, но не хочу - слишком много завязано). Поэтому удаление делаю пошагово: запросами удаляю "слабо-зависимые" сущности, затем основную. В любом случае, это несколько строк. Как обезопаситься при многопоточном обращении? какую проблему вы видите в многопоточности? В вашей ситуации многопоточность разруливается на уровне транзакций базы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 13:28:29 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
Да уж, это многопоточность меня сильно накрыла. Основную ошибку я осознал: для небольшого проекта я между @Controller и @Repository не стал ставить @Service, возложив его функции на @Repository, отсюда такая сумятица. Так как я окончательно себя запутал, решил исходить из scope создаваемых Spring-компонентов (@Component): уже понятно, что @Repository - это по дефолту синглтон, отсюда нюансы работы в многопоточной среде; методы @Controller'а вызываются в сессионном контексте (или request). А что по поводу @Service? - Его видимость определяется контекстом контроллера или иным способом? Как бы из определения и сути данного компонента понятно, что потоки при вызове методов сталкиваться не должны, но все интересно мнение. Вопрос христоматийный, это понятно, но видимо, что я неправильно задаю критерии поиска проблемы, поэтому ответы из доки не получил. И вдогонку второй вопрос: а можно все же объединить @Service и @Repository, или если так хочется, то только раздувать @Controller? - Уж больно у меня ненужная получается прослойка-сервис ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 17:33:01 |
|
||
|
А вы используете Hibernate Based Generic DAO?
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, Объединить, как раз можно Controller и Service. Во-многих случаях, если Service просто делегирует вызов в Repository, то и надобности в нем нет. @Transactional можно повесить и на Controller. Это же мнение не так давно высказывал IT на форуме архитектуры: http://rsdn.ru/forum/design ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 21:37:33 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38322285&tid=2129041]: |
0ms |
get settings: |
16ms |
get forum list: |
31ms |
check forum access: |
9ms |
check topic access: |
9ms |
track hit: |
59ms |
get topic data: |
25ms |
get forum data: |
6ms |
get page messages: |
118ms |
get tp. blocked users: |
3ms |
| others: | 289ms |
| total: | 565ms |

| 0 / 0 |
