|
|
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
1)На методы какого уровня(DAO/Service/Facade/Controller обычно/правильно/принято ставить аннотации @Transactional ? 2)Какой способ борьбы с LazyInitializationException для Web вы используете? -OpenSessionInViewFilter -HibernateInterceptor -Value Bean -Hibernate.initialize -HQL(FETCH) что нибудь еще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 11:59:19 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
rdm1)На методы какого уровня(DAO/Service/Facade/Controller обычно/правильно/принято ставить аннотации @Transactional ? На Service. Потому что в большинстве случаев Service это реализация паттерна Transaction Script - посмотрите у Фаулера. Контроллер не должен использовать несколько методов разных сервисов, потому что это уже бизнес-логика будет. В фасаде тоже не всгеда есть смысл. Будет ситуация что в одном фасаде одни траназакции, а в другом уже другие? Зачем? В DAO можно для подстраховки. Чтобы, например, выкидывался Exception, если нет транзакционного контекста. Но такой прощще сделать в Spring XML на все DAO методы сразу, чем писать в каждом аннотацию. rdm2)Какой способ борьбы с LazyInitializationException для Web вы используете? -OpenSessionInViewFilter Гуглить "Open Session In View Antipattern" - много подробных статей с описанием проблем этого подхода. rdm -HibernateInterceptor -Value Bean Не очень понял что за подходы. rdm -Hibernate.initialize -HQL(FETCH) Вот эти два - однозначно. Есть интересные альтернативы например http://noon.gilead.free.fr/gilead/index.php?page=tutorial Но они не во всех случаях подходят. Конкретно этот под GWT заточен. Но можно подсмотреть идею и написать реализацию для своего сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 12:11:03 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, -HibernateInterceptor тут есть пример, у меня честно говоря он не заработал, может вы подскажете почему? <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <bean id="businessObjectTarget" class="org.beq.BusinessObjectImpl"> <property name="someDAO"> <ref bean="someDAO" /> </property> </bean> <bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <ref bean="businessObjectTarget" /> </property> <property name="proxyInterfaces"> <value>org.beq.IBusinessObject</value> </property> <property name="interceptorNames"> <list> <value>hibernateInterceptor</value> </list> </property> </bean> Ошибки нет, а в логах пишет следующее: Not refreshing target: Bean name not specified in 'interceptorNames'. -Value Bean это аналог DTO, т.е. заполняем аналогичные поля вызывает просто get() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 12:27:28 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, в если в методе контроллера надо вызвать методы двух разных сервисов или 3-5? Как обойтись без фасада? Как я понял из ваших слов, тогда получается бизнес логика в контроллере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 12:28:57 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
rdm-HibernateInterceptor тут есть пример, у меня честно говоря он не заработал, может вы подскажете почему? Ну, это как бы и есть дефолтное поведение. На всех сервисах где есть транзакционный контекст биндится туда же и Session. Что такого особого в этом HibernateInterceptor? Это вроде и есть самый обычный подход. rdm Ошибки нет, а в логах пишет следующее: Not refreshing target: Bean name not specified in 'interceptorNames'. Интерцептор нужно привязывать ко всем сервисам. interceptorNames - имена всех бинов, для которых Interceptor будет вызыватся. rdm -Value Bean это аналог DTO, т.е. заполняем аналогичные поля вызывает просто get() Тут просто масса минусов. Если DTO максимально повтрояет сущности. То нужно поддерживать обе модели. Два набора схожих классов. Точно так же никуда не девается проблема N+1, как и в Open Session In View. Т.е. вероятность схлопотать N+1 всегда есть, если девелопер не планирует правильный Fetch в каждом месте. Могут быть другие нюансы в зависимости от приложения. Например удаление работает через Persistent коллекции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 12:43:45 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
rdmBlazkowicz, в если в методе контроллера надо вызвать методы двух разных сервисов или 3-5? Как обойтись без фасада? Как я понял из ваших слов, тогда получается бизнес логика в контроллере? Не понял при чем тут фасад? Контроллер это то что обрабатывает ввод пользователя и формирует view. Логику он делегирует сервису. Фасад это вообще подмножество методов доступных из разных сервисов. Если фасад начинает сам в одном своём методе вызывать разные методы сервисов, это снова бизнес логика не на месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 12:45:59 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
rdm2)Какой способ борьбы с LazyInitializationException для Web вы используете? что нибудь еще? - все способы индивидуальны под проект - не забывать самому коммитить когда надо, закрывать сессию когда она не нужна. Автоуборщиков и сборщиков тут нету. ЗЫ. В архитектуре почти нет антипаттернов, т.к. зависит от проекта А вот в семантике кода - полно, т.к. задача кода обычно локальна и описывается одной функцией (атомарна) http://govnokod.ru/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 12:49:21 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
rdm2) -HQL(FETCH) Я за этот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:23:59 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
Petro123В архитектуре почти нет антипаттернов, т.к. зависит от проекта Есть. Почитай Тейта "Горький вкус Java". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:24:44 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
rdm1)На методы какого уровня(DAO/Service/Facade/Controller обычно/правильно/принято ставить аннотации @Transactional ? Вот тут очень грамотно описаны всевозможные стратегии по транзакциям http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=transaction+strategies: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:27:35 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
забыл ник, читал из серии 2 статьи, которые на русском) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:30:00 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
rdmзабыл ник, читал из серии 2 статьи, которые на русском) На английском лучше) Еще можно и его книгу прочитать) А раз читали, то почему у вас вопросы возникают? Там весьма и весьма грамотно описано где, как и почему надо использовать @Transactional ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:37:34 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
Кстати, как сделать чтобы несколько ModelAttribute методов выполнялись в одной транзакции? Вот пример из документации: // Add one attribute // The return value of the method is added to the model under the name "account" // You can customize the name via @ModelAttribute("myAccount") @ModelAttribute public Account addAccount(@RequestParam String number) { return accountManager.findAccount(number); } // Add multiple attributes @ModelAttribute public void populateModel(@RequestParam String number, Model model) { model.addAttribute(accountManager.findAccount(number)); // add more ... } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:42:00 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
забыл ник, я не запоминаю, так сказать lazy память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:44:08 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪКстати, как сделать чтобы несколько ModelAttribute методов выполнялись в одной транзакции? Вот пример из документации: Нет такого понятия "ModelAttribute-метод" и к транзакциям эта аннотация вообще не относится. Это просто пометку спрингу положить результат работы метода в model. Как их запустить в одной транзакции это отдельный вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:47:45 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
Нет такого понятия "ModelAttribute-метод" Под "ModelAttribute-метод" я имел в виду метод с аннотацией @ModelAttribute. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:51:32 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
Как их запустить в одной транзакции это отдельный вопрос. По-видимому, никак. Для сложных контроллеров получение соединения из пула и создание хибернейт сессии будет происходить десятки раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 13:55:13 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪПо-видимому, никак. Для сложных контроллеров получение соединения из пула и создание хибернейт сессии будет происходить десятки раз. Что такое "сложный" контроллер? Это тот в котором реализована логика в нарушение SRP. Контроллер не должен контролировать транзации. Он должен контроллировать ввод и сборку модели. В том примере это вообще 2 разных методы самого контроллера. Два примера сделать одно и то же разными способами. Они вообще в одной транзакции никогда не работают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 14:05:09 |
|
||
|
Два маленьких вопроса про Spring
|
|||
|---|---|---|---|
|
#18+
LeonidvPetro123В архитектуре почти нет антипаттернов, т.к. зависит от проекта Есть. Почитай Тейта "Горький вкус Java". ты пиши проще. Типа: "-1" или "я против". Иначе ждём антипаттерн с той книги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 14:18:11 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37734587&tid=2132155]: |
0ms |
get settings: |
12ms |
get forum list: |
25ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
56ms |
get topic data: |
19ms |
get forum data: |
4ms |
get page messages: |
113ms |
get tp. blocked users: |
2ms |
| others: | 342ms |
| total: | 587ms |

| 0 / 0 |
