|
|
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
Это какая-то базовая проблема настройки хибернейта, я в этом не силен. Друзья, поделитесь пожалуйста опытом, даже если это нубский вопрос Конфигурация Spring: Код: xml 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. Реализация AbstractDAOImpl Код: 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. Проблема вот в чем - в реализации AbstractDAOImpl. Там должен по-хорошему должен использоваться hibernateTemplate, который оперирует DetachedCriteria. Если объект, например User выбрать например с помощью Код: java 1. 2. 3. то потом у User'а проблемы с ленивой инициализацией коллекции getRoles() - если просто взять user.getRoles(), то получим Lazy initialization exception, также эксепшн выдает и Hibernate.initialize(user.getRoles()); Поэтому я сделал так, как сейчас в коде Код: java 1. 2. 3. при этом сессия сохраняется и если взять user.getRoles(), то все пройдет без проблем - коллекция проинициализируется сама. Проблема в том, что эти коннекшны совсем не убиваются, а подвисают и после нескольких обновлений страницы браузера все виснет на выполнении criteria.list() - наверное коннекшны закончились. Для обработки коннекшнов я подключил к хибернейту c3p0 кэш Да и вообще проблема не в способе создании Criteria, а в способе взятия сессий - в методе public T get(Long id) такая же проблема будет Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 00:16:52 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
Суть hibernate в том, чтобы предоставить объектную структуру во время выполнения транзакции. Для выноса объектов за пределы сервиса лучше копировать их в отдельные DTO. P.S. вышеизложенное - моё личное имхо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 00:32:33 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
По-моему в последних версиях идет отказ от hibernate template, в пользу второго варианта. У вас выходит в hibernate template создаётся своя сессия. Вот за пределами template её уже и не видно. Если вы уверены что дело в соединениях, то нужно натравить транзакции на конкретные классы и методы. Почитайте про аннотацию @Transactional и поставьте её. В пределах метода обозначеного этой аннотацией можно будет загружать ленивые зависимости. А при выходе из такого метода контейнер закроет транзакцию и сессию. Обратите внимате, что ленивые ассоциации можно загружать сразу же, если они нужны в конкретном методе с помощью FetchMode. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 01:28:55 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
ЛагманСуть hibernate в том, чтобы предоставить объектную структуру во время выполнения транзакции. Для выноса объектов за пределы сервиса лучше копировать их в отдельные DTO. P.S. вышеизложенное - моё личное имхо Не боитесь что придется копировать 1 к 1? Как быть в случаях когда почти все объекты нужны за приделами сервиса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 11:39:56 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсли вы уверены что дело в соединениях, то нужно натравить транзакции на конкретные классы и методы. Почитайте про аннотацию @Transactional и поставьте её. В пределах метода обозначеного этой аннотацией можно будет загружать ленивые зависимости. А при выходе из такого метода контейнер закроет транзакцию и сессию. Спасибо за советы. Но мне сделать метод @Transactional не подойдет - коллекциями ведь мне нужно пользоваться извне DAO, причем неизвестно какая пользователю понадобится, и если их загрузить сразу, тогда какой смысл в Lazy инициализации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 14:04:30 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawaНо мне сделать метод @Transactional не подойдет - коллекциями ведь мне нужно пользоваться извне DAO @Transactional можно (и нужно) пользовать и вне DAO. snawa, причем неизвестно какая пользователю понадобится, и если их загрузить сразу, тогда какой смысл в Lazy инициализации Сценариев много. В одних нужны зависимости, в других нет. Lazy везде по-умолчанию, чтобы максимально обрезать ассоциации, где они, возможно, не нужны. В любом случае чтобы догрузить ленивую ассоциацию, нужно держать открытую сессию. Которая вбольшинстве фреймверков 1-к-1 связана с транзакцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 17:51:02 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
Можно, конечно максимально расширить область видимости сессии с помощью OpenSessionInView, но это скорее заплатка, чем полноценное качественное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 17:51:55 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
ТимоН, вариантов то нет, или отключать lazy или копировать, в чем тогда профит hibernate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 20:34:20 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawaпричем неизвестно какая пользователю понадобится, тут надо расшифровать, почему - неизвестно? В ГУИ неизвестно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2013, 22:29:30 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
Petro123snawaпричем неизвестно какая пользователю понадобится, тут надо расшифровать, почему - неизвестно? В ГУИ неизвестно? Да, из ГУИ могут использоваться разные коллекциия - смысла их всех инициализить нету ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 12:13:21 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawaДа, из ГУИ могут использоваться разные коллекциия - смысла их всех инициализить нету Жирный удаленный GUI? Правильно. Все инициализировать не нужно. А вот те которые нужны в каждом конкретном use-case - очень желательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 12:14:33 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawaPetro123пропущено... тут надо расшифровать, почему - неизвестно? В ГУИ неизвестно? Да, из ГУИ могут использоваться разные коллекциия - смысла их всех инициализить нету верно. Нажали на сисок Городов по всей России - они загрузились. Значит, когда нужно грузить - вызовется НУЖНЫЙ контроллёр. Так? Т.е. мы в ГУИ не знаем, но на сервере всегда знаем. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 12:15:31 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczsnawaНо мне сделать метод @Transactional не подойдет - коллекциями ведь мне нужно пользоваться извне DAO @Transactional можно (и нужно) пользовать и вне DAO. snawa, причем неизвестно какая пользователю понадобится, и если их загрузить сразу, тогда какой смысл в Lazy инициализации Сценариев много. В одних нужны зависимости, в других нет. Lazy везде по-умолчанию, чтобы максимально обрезать ассоциации, где они, возможно, не нужны. В любом случае чтобы догрузить ленивую ассоциацию, нужно держать открытую сессию. Которая вбольшинстве фреймверков 1-к-1 связана с транзакцией. Т.е. @Transactional можно помечать методы в UI классах, где например сначала вычитывается объект, а потом берется его коллекция? Как-то это не очень с первого взгляда. Или это нормальная практика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 12:16:15 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawaТ.е. @Transactional можно помечать методы в UI классах, где например сначала вычитывается объект, а потом берется его коллекция? Как-то это не очень с первого взгляда. Или это нормальная практика? Достаточно трудно угадать что именно у вас за архитектура. Вы даже не сообщили у вас 3-tier или 2-tier. Обычно дела обстоят так UI, грубо говоря, запрашиваен данные у Domain Model, а вот Domain Model уже запускает транзакцию, вычитывает все необходимые данные и возвращает их. Дозагрузка данных в UI называется OpenSessionInView и, иногда, практикуется в Web. Хотя у этого подхода есть свои недостатки. В жирном gui такой подход сложно применить. В 3-tier, так вообще не возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 12:22:52 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
я бы делил вдругой плоскости. Есть 10 контролов в ГУИ. 2 варианта: - без AJAX все 10 грузятся заранее - никакойленивой загрузки. Либо она есть, но при запросе формы контроллёр грузит всё. - с AJAX 3 контрула подгружаются по клику. Событе отправится в контроллёр и тоже знаем. Какое вариант - решает БЛ а не программист. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 12:27:55 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczsnawaТ.е. @Transactional можно помечать методы в UI классах, где например сначала вычитывается объект, а потом берется его коллекция? Как-то это не очень с первого взгляда. Или это нормальная практика? Достаточно трудно угадать что именно у вас за архитектура. Вы даже не сообщили у вас 3-tier или 2-tier. Обычно дела обстоят так UI, грубо говоря, запрашиваен данные у Domain Model, а вот Domain Model уже запускает транзакцию, вычитывает все необходимые данные и возвращает их. Дозагрузка данных в UI называется OpenSessionInView и, иногда, практикуется в Web. Хотя у этого подхода есть свои недостатки. В жирном gui такой подход сложно применить. В 3-tier, так вообще не возможно. 3-tier, веб-приложение с использованием ZK framework Поясню немного схему - допустим на UI есть два метода контроллера, Код: java 1. 2. 3. 4. 5. один получает из сервиса список пользователей, чтобы отобразить их фамилии, а другой получает список пользователей, чтобы отобразить их в таблице с колонками "фамилия", "список ролей", список ролей берется из lazy коллекции user.getRoles(). При этом дергается один и тот же метод сервиса UserService.getUsers(), который в свою очередь обращается к UserDAO, примерную реализацию которого я описал выше. Причем во ViewController я не хочу беспокоится о том, загружены данные или нет - просто выполняю user.getRoles() в любом месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 18:34:32 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawa3-tier, веб-приложение с использованием ZK framework Причем во ViewController я не хочу беспокоится о том, загружены данные или нет. Собственно весь вопрос в эти два предложения можно было уложить. Ой! Что-тут у нас? Не к столу будет сказано OpenSessionInView от ZK: http://www.zkoss.org/javadoc/latest/zk/org/zkoss/zkplus/hibernate/OpenSessionInViewListener.html Ну, и для самообразования рекомендую http://blog.frankel.ch/the-opensessioninview-antipattern ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 18:45:23 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawaво ViewController я не хочу беспокоится о том, загружены данные или нет только что мы не знали, где у нас какие свойство нужны. Теперь [внезапно] все мы прекрасно знаем: в fillUserList() нам нужны только имена, в fillUserTable нам нужны роли. Спрашивается, почему бы не фетчить что надо, там где это надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 18:56:08 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsnawa3-tier, веб-приложение с использованием ZK framework Причем во ViewController я не хочу беспокоится о том, загружены данные или нет. Собственно весь вопрос в эти два предложения можно было уложить. Ой! Что-тут у нас? Не к столу будет сказано OpenSessionInView от ZK: http://www.zkoss.org/javadoc/latest/zk/org/zkoss/zkplus/hibernate/OpenSessionInViewListener.html Ну, и для самообразования рекомендую http://blog.frankel.ch/the-opensessioninview-antipattern про OpenSessionInView слышал, но в основном негатив. Типа используйте, но лучше не надо. Неужели нету никакой хорошей практики? chpashasnawaво ViewController я не хочу беспокоится о том, загружены данные или нет только что мы не знали, где у нас какие свойство нужны. Теперь [внезапно] все мы прекрасно знаем: в fillUserList() нам нужны только имена, в fillUserTable нам нужны роли. Спрашивается, почему бы не фетчить что надо, там где это надо. По вашему, в сервисе по работе с юзером, у которого например две lazy коллекции нужно заранее предусмотреть методы getUsersWithoutInit(), getUsersWithRoles(), getUsersWithOtherCollection(), getUsersWithRolesAndOtherCollection() и т.д. до n! ? Бред кажется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 20:21:02 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawaПо вашему, в сервисе по работе с юзером, у которого например две lazy коллекции нужно заранее предусмотреть методы getUsersWithoutInit(), getUsersWithRoles(), getUsersWithOtherCollection(), getUsersWithRolesAndOtherCollection() и т.д. до n! ? Бред кажетсяэто разумный компромисс между "тащить все" и "загружать все лениво" потому что ни один из этих подходов не является оптимальным с точки зрения производительности. а с точки зрения удобства программера оба подхода конечно зашибись, в любом случае ничего не надо делать. по поводу кучи методов - если повторяющиеся запросы достаточно сложны, выделите общую часть с помощью criteria, и в каждом методе добавляй только изменяющийся фетч. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 20:39:28 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawa, Давай хоть один негатив про сессию на окно-форму. Правильно сказали - нет золотой пули. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 21:16:30 |
|
||
|
Spring+Hibernate вопрос о работе с сессиями в DAO объектах
|
|||
|---|---|---|---|
|
#18+
snawaПо вашему, в сервисе по работе с юзером, у которого например две lazy коллекции нужно заранее предусмотреть методы getUsersWithoutInit(), getUsersWithRoles(), getUsersWithOtherCollection(), getUsersWithRolesAndOtherCollection() и т.д. до n! ? Бред кажется В среднем, хватает 2х-3х вариантов: загрузить одного юзера, но со всеми зависимостями; загрузить список без зависимостей; загрузить список с какими-то конкретными зависимостями. У вас в системе не будет 100500 вариантов показа списка пользователей. Ну, и на крайний случай, если таки надо 100500 вариантов (что само по себе подозрительно), то всегда можно из сервиса, в DAO передать список свойств, для которых нужен Eager Fetch. Код: java 1. 2. 3. 4. 5. 6. 7. Есть, правда, нюанс, что JOIN не всегда, подходит, иногда таки нужен Select, но это уже детали реализации классов User/UserDAO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 21:16:42 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38165357&tid=2129904]: |
0ms |
get settings: |
17ms |
get forum list: |
23ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
69ms |
get topic data: |
16ms |
get forum data: |
5ms |
get page messages: |
88ms |
get tp. blocked users: |
2ms |
| others: | 316ms |
| total: | 550ms |

| 0 / 0 |
