|
|
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Добрый день. Быстро писали приложение и нафигачилось вот такое вот в DAO классах: Код: 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. Я даже не сомневаюсь, что тут куча плохих "идей", поэтому прошу совета и критики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 15:30:24 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Мои соболезнования. Особо крупные промахи 1) Каждый метод, каждого DAO класса вручную пускает, откатывает и коммитит транзакцию. Офигеть. Декларативным транзакциям в Spring уже лет 5-7. В JEE немногим меньше. 2) Т.е. если мне нужно внутри одной транзакции вызвать 2 метода DAO, я могу застрелится. Потому что этого не предусмотрено. 3) Открытие сессии можно было делегировать родительскому классу. 4) Exception ловится, прокидывается, тут же ловится снова, чтобы похерить cause и оригинальный stacktrace По мелочи. 5) Валидация в DAO спорный вопрос. С таким подходом вообще в каждом методе можно начинать с огромного блока проверки на null всего нужного. Ну и для null значений не грех и NullPointer выкинуть, а не IllegalArgument 4) catch(Exception e) - тоже не относится к BestPractice. Ловить стоит только конкретные исключения, которые выкидывают используемые методы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 15:39:06 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, В то время, когда проект писался, видимо еще не разбирались с @Transactional . А насчет stack trace там опечатка точно. Было вот так: Код: java 1. А открытие сессии в родительском методе это вы что имеете ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 15:50:17 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaks, чтобы оставить общий вид, и не использовать спринг и возможности джава ее, можно во-первых написать параметризованный дао на основные операции, потом наследоваться и доопределять нужные методы , во-вторых использовать динамик прокси и аннотации для управления транзакциями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 15:50:52 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
javapecker, Spring в проекте будет использоваться (или он уже внедрен, не уточнял еще). Обобщенный DAO наверно можно сделать что-то типа такого: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. А еще лучше наверно всё это вынести в properties файл. и инжектить MessageSource . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 15:56:24 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaksВ то время, когда проект писался, видимо еще не разбирались с @Transactional . Давайте конкретные даты. Не стесняйтесь. "Spring 2.0 was released in October 2006" Т.е. вообще ничего не ёкнуло от одинакового кода в каждом методе? Даже без декларативных транзакций есть 100500 вариантов обернуть управление транзакцией и сессией в один метод. scymaksА открытие сессии в родительском методе это вы что имеете ввиду? getSession() вместо sessionFactory.openSession() Хотя в большинстве систем сессия и транзакция связаны 1-к-1 так что их оба можно было в один метод вынести. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 15:59:09 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, июль, 2010. Код источал слезы, но он был локализован в DAO классах и потому мы решили не трогать его, до тех пор пока кто-нибудь не разберется досконально с declarative transaction. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:09:15 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaks, у тебя 2 варианта по try - спринг - без спринга в сети есть Код: java 1. выбирай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:09:39 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaksОбобщенный DAO наверно можно сделать что-то типа такого: не мешай всё в кучу. Сначала разберись с спринг (если он будет). Потом шаблонизация DAO. Я лично от неё профита не вижу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:12:07 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaksКод источал слезы, но он был локализован в DAO классах и потому мы решили не трогать его, до тех пор пока кто-нибудь не разберется досконально с declarative transaction. Ну, тогда, выкидываем всё лишнее. Наследуемся от HibernateDaoSupport и навешиваем @Transactional. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:13:31 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, А вот вообще, каких подводных камней ждать от Declarative transaction management? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:18:38 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaks, мне кажется это как раз средство расчистки камней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:19:32 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaksА вот вообще, каких подводных камней ждать от Declarative transaction management? Не надо никаких ждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:20:54 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, можно ждать если использовать вложенные методы которые не обернутся аспектом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:23:14 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Лагманможно ждать если использовать вложенные методы которые не обернутся аспектом Для DAO - пофиг. Но, в целом да. Забыл про это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:29:09 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaksА вот вообще, каких подводных камней ждать от Declarative transaction management? не стать конфигурастом)))) Т.к. это метапрограммирование. Там нужно знать что какие значки означают. Какая у них совместимость и т.д. Короче ещё один ЯП. Но это инновации)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:33:30 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Лагман, Можно поподробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:34:08 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
scymaksЛагман, Можно поподробнее? Если в DAO классе есть метод не транзакционный. Он вызывает другой метод этого же класса, и этот метод помечен как @Transactional, то транзакция всё равно не начнется, потому что работу с транзакцией реализует прокси. А прямой вызов идёт мимо этой прокси. В DAO это редкость. А вот в слое логики, вполне может приключится такое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:41:43 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 16:45:23 |
|
||
|
[Hibernate] Проблема с антипаттерном
|
|||
|---|---|---|---|
|
#18+
А мне больше всего понравилась обработка эксцепшена. А что! Информативно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2013, 19:30:10 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2129887]: |
0ms |
get settings: |
20ms |
get forum list: |
26ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
60ms |
get topic data: |
21ms |
get first new msg: |
11ms |
get forum data: |
4ms |
get page messages: |
96ms |
get tp. blocked users: |
3ms |
| others: | 302ms |
| total: | 555ms |

| 0 / 0 |
