Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Два маленьких вопроса про Spring / 21 сообщений из 21, страница 1 из 1
02.04.2012, 11:59:19
    #37734374
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
1)На методы какого уровня(DAO/Service/Facade/Controller обычно/правильно/принято ставить аннотации @Transactional ?

2)Какой способ борьбы с LazyInitializationException для Web вы используете?
-OpenSessionInViewFilter
-HibernateInterceptor
-Value Bean
-Hibernate.initialize
-HQL(FETCH)
что нибудь еще?
...
Рейтинг: 0 / 0
02.04.2012, 12:11:03
    #37734393
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
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 заточен. Но можно подсмотреть идею и написать реализацию для своего сервера.
...
Рейтинг: 0 / 0
02.04.2012, 12:27:28
    #37734413
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
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()
...
Рейтинг: 0 / 0
02.04.2012, 12:28:57
    #37734417
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Blazkowicz, в если в методе контроллера надо вызвать методы двух разных сервисов или 3-5? Как обойтись без фасада?
Как я понял из ваших слов, тогда получается бизнес логика в контроллере?
...
Рейтинг: 0 / 0
02.04.2012, 12:43:45
    #37734456
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
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 коллекции.
...
Рейтинг: 0 / 0
02.04.2012, 12:45:59
    #37734462
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
rdmBlazkowicz, в если в методе контроллера надо вызвать методы двух разных сервисов или 3-5? Как обойтись без фасада?
Как я понял из ваших слов, тогда получается бизнес логика в контроллере?
Не понял при чем тут фасад?
Контроллер это то что обрабатывает ввод пользователя и формирует view. Логику он делегирует сервису.
Фасад это вообще подмножество методов доступных из разных сервисов. Если фасад начинает сам в одном своём методе вызывать разные методы сервисов, это снова бизнес логика не на месте.
...
Рейтинг: 0 / 0
02.04.2012, 12:49:21
    #37734473
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
rdm2)Какой способ борьбы с LazyInitializationException для Web вы используете?
что нибудь еще?
- все способы индивидуальны под проект
- не забывать самому коммитить когда надо, закрывать сессию когда она не нужна.
Автоуборщиков и сборщиков тут нету.
ЗЫ.
В архитектуре почти нет антипаттернов, т.к. зависит от проекта
А вот в семантике кода - полно, т.к. задача кода обычно локальна и описывается одной функцией (атомарна)
http://govnokod.ru/
...
Рейтинг: 0 / 0
02.04.2012, 13:23:59
    #37734555
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
rdm2) -HQL(FETCH)
Я за этот.
...
Рейтинг: 0 / 0
02.04.2012, 13:24:44
    #37734556
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Petro123В архитектуре почти нет антипаттернов, т.к. зависит от проекта
Есть. Почитай Тейта "Горький вкус Java".
...
Рейтинг: 0 / 0
02.04.2012, 13:27:35
    #37734565
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
rdm1)На методы какого уровня(DAO/Service/Facade/Controller обычно/правильно/принято ставить аннотации @Transactional ?

Вот тут очень грамотно описаны всевозможные стратегии по транзакциям http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=transaction+strategies:
...
Рейтинг: 0 / 0
02.04.2012, 13:30:00
    #37734569
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
забыл ник, читал из серии 2 статьи, которые на русском)
...
Рейтинг: 0 / 0
02.04.2012, 13:37:34
    #37734581
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
rdmзабыл ник, читал из серии 2 статьи, которые на русском)
На английском лучше) Еще можно и его книгу прочитать) А раз читали, то почему у вас вопросы возникают? Там весьма и весьма грамотно описано где, как и почему надо использовать @Transactional
...
Рейтинг: 0 / 0
02.04.2012, 13:42:00
    #37734587
Йуный джавистЪ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Кстати, как сделать чтобы несколько 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 ...
}
...
Рейтинг: 0 / 0
02.04.2012, 13:44:08
    #37734590
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
забыл ник, я не запоминаю, так сказать lazy память.
...
Рейтинг: 0 / 0
02.04.2012, 13:47:45
    #37734597
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Йуный джавистЪКстати, как сделать чтобы несколько ModelAttribute методов выполнялись в одной транзакции? Вот пример из документации:

Нет такого понятия "ModelAttribute-метод" и к транзакциям эта аннотация вообще не относится. Это просто пометку спрингу положить результат работы метода в model. Как их запустить в одной транзакции это отдельный вопрос.
...
Рейтинг: 0 / 0
02.04.2012, 13:51:32
    #37734607
Йуный джавистЪ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Нет такого понятия "ModelAttribute-метод"

Под "ModelAttribute-метод" я имел в виду метод с аннотацией @ModelAttribute.
...
Рейтинг: 0 / 0
02.04.2012, 13:55:13
    #37734613
Йуный джавистЪ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Как их запустить в одной транзакции это отдельный вопрос.

По-видимому, никак. Для сложных контроллеров получение соединения из пула и создание хибернейт сессии будет происходить десятки раз.
...
Рейтинг: 0 / 0
02.04.2012, 14:05:09
    #37734631
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Йуный джавистЪПо-видимому, никак. Для сложных контроллеров получение соединения из пула и создание хибернейт сессии будет происходить десятки раз.
Что такое "сложный" контроллер? Это тот в котором реализована логика в нарушение SRP. Контроллер не должен контролировать транзации. Он должен контроллировать ввод и сборку модели.
В том примере это вообще 2 разных методы самого контроллера. Два примера сделать одно и то же разными способами. Они вообще в одной транзакции никогда не работают
...
Рейтинг: 0 / 0
02.04.2012, 14:18:11
    #37734654
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
LeonidvPetro123В архитектуре почти нет антипаттернов, т.к. зависит от проекта
Есть. Почитай Тейта "Горький вкус Java".
ты пиши проще. Типа: "-1" или "я против".
Иначе ждём антипаттерн с той книги.
...
Рейтинг: 0 / 0
02.04.2012, 15:24:33
    #37734759
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Petro123Иначе ждём антипаттерн с той книги.
Любой, кто хочет познакомится с антипаттернами из этой книги, может сделать это прочитав ее. Книга хорошая, хотя может и малость устаревшая.
...
Рейтинг: 0 / 0
02.04.2012, 15:44:21
    #37734795
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Два маленьких вопроса про Spring
Спасибо за ответы!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Два маленьких вопроса про Spring / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]