Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / [Hibernate] Проблема с антипаттерном / 21 сообщений из 21, страница 1 из 1
27.02.2013, 15:30:24
    #38168176
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Добрый день.

Быстро писали приложение и нафигачилось вот такое вот в 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.
public void add(SomeObject someObject) {
    if (someObject == null) {
       throw new IllegalArgumentException();
    }

    try {
         Session session = sessionFactory.openSession();
         
         Transaction transaction = null;

         try {
             transaction = session.beginTransaction();
             session.save(someObject);
             transaction.commit();
         } catch(Exception e) {
              if (transaction != null) { transaction.rollback(); }
              throw e;
         } finally {
              session.close();
         }
    } catch(Exception e) {
         throw new RuntimeException("Ошибка при добавлении ...");      
    }
}



Я даже не сомневаюсь, что тут куча плохих "идей", поэтому прошу совета и критики.
...
Рейтинг: 0 / 0
27.02.2013, 15:39:06
    #38168195
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Мои соболезнования.
Особо крупные промахи
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. Ловить стоит только конкретные исключения, которые выкидывают используемые методы.
...
Рейтинг: 0 / 0
27.02.2013, 15:50:17
    #38168209
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Blazkowicz,

В то время, когда проект писался, видимо еще не разбирались с @Transactional .

А насчет stack trace там опечатка точно.

Было вот так:

Код: java
1.
throw new RuntimeException("Ошибка добавления ... ", e);



А открытие сессии в родительском методе это вы что имеете ввиду?
...
Рейтинг: 0 / 0
27.02.2013, 15:50:52
    #38168215
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaks,
чтобы оставить общий вид, и не использовать спринг и возможности джава ее, можно во-первых написать параметризованный дао на основные операции, потом наследоваться и доопределять нужные методы , во-вторых использовать динамик прокси и аннотации для управления транзакциями.
...
Рейтинг: 0 / 0
27.02.2013, 15:56:24
    #38168221
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
javapecker,

Spring в проекте будет использоваться (или он уже внедрен, не уточнял еще).

Обобщенный DAO наверно можно сделать что-то типа такого:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
abstract class DAO<T, ID> {
     public abstract void add(T t);
     public abstract void update(T t);
     public abstract void delete(T t);
     public abstract List<T> getAll();
     public abstract T getById(ID id); 

     protected abstract String getAddErrorMessage();
     protected abstract String getUpdateErrorMessage();
     protected abstract String getDeleteErrorMessage();
     protected abstract String getGetAllErrorMessage();
     protected abstract String getGetByIdErrorMessage();
}



А еще лучше наверно всё это вынести в properties файл. и инжектить MessageSource .
...
Рейтинг: 0 / 0
27.02.2013, 15:59:09
    #38168227
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaksВ то время, когда проект писался, видимо еще не разбирались с @Transactional .

Давайте конкретные даты. Не стесняйтесь.
"Spring 2.0 was released in October 2006"
Т.е. вообще ничего не ёкнуло от одинакового кода в каждом методе? Даже без декларативных транзакций есть 100500 вариантов обернуть управление транзакцией и сессией в один метод.

scymaksА открытие сессии в родительском методе это вы что имеете ввиду?
getSession() вместо sessionFactory.openSession()
Хотя в большинстве систем сессия и транзакция связаны 1-к-1 так что их оба можно было в один метод вынести.
...
Рейтинг: 0 / 0
27.02.2013, 16:09:15
    #38168243
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Blazkowicz,

июль, 2010.

Код источал слезы, но он был локализован в DAO классах и потому мы решили не трогать его, до тех пор пока кто-нибудь не разберется досконально с declarative transaction.
...
Рейтинг: 0 / 0
27.02.2013, 16:09:39
    #38168244
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaks,
у тебя 2 варианта по try
- спринг
- без спринга в сети есть
Код: java
1.
public class HibernateUtil


выбирай
...
Рейтинг: 0 / 0
27.02.2013, 16:12:07
    #38168250
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaksОбобщенный DAO наверно можно сделать что-то типа такого:
не мешай всё в кучу. Сначала разберись с спринг (если он будет). Потом шаблонизация DAO.
Я лично от неё профита не вижу
...
Рейтинг: 0 / 0
27.02.2013, 16:13:31
    #38168251
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaksКод источал слезы, но он был локализован в DAO классах и потому мы решили не трогать его, до тех пор пока кто-нибудь не разберется досконально с declarative transaction.
Ну, тогда, выкидываем всё лишнее. Наследуемся от HibernateDaoSupport и навешиваем @Transactional.
...
Рейтинг: 0 / 0
27.02.2013, 16:18:38
    #38168257
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Blazkowicz,

А вот вообще, каких подводных камней ждать от Declarative transaction management?
...
Рейтинг: 0 / 0
27.02.2013, 16:19:32
    #38168260
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaks,
мне кажется это как раз средство расчистки камней
...
Рейтинг: 0 / 0
27.02.2013, 16:20:54
    #38168264
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaksА вот вообще, каких подводных камней ждать от Declarative transaction management?
Не надо никаких ждать.
...
Рейтинг: 0 / 0
27.02.2013, 16:23:14
    #38168269
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Blazkowicz,

можно ждать если использовать вложенные методы которые не обернутся аспектом
...
Рейтинг: 0 / 0
27.02.2013, 16:29:09
    #38168283
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Лагманможно ждать если использовать вложенные методы которые не обернутся аспектом
Для DAO - пофиг. Но, в целом да. Забыл про это.
...
Рейтинг: 0 / 0
27.02.2013, 16:33:30
    #38168291
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaksА вот вообще, каких подводных камней ждать от Declarative transaction management?
не стать конфигурастом))))
Т.к. это метапрограммирование.
Там нужно знать что какие значки означают. Какая у них совместимость и т.д. Короче ещё один ЯП.
Но это инновации))
...
Рейтинг: 0 / 0
27.02.2013, 16:34:08
    #38168292
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Лагман,

Можно поподробнее?
...
Рейтинг: 0 / 0
27.02.2013, 16:41:43
    #38168313
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
scymaksЛагман,

Можно поподробнее?
Если в DAO классе есть метод не транзакционный.
Он вызывает другой метод этого же класса, и этот метод помечен как @Transactional, то транзакция всё равно не начнется, потому что работу с транзакцией реализует прокси. А прямой вызов идёт мимо этой прокси. В DAO это редкость. А вот в слое логики, вполне может приключится такое.
...
Рейтинг: 0 / 0
27.02.2013, 16:45:23
    #38168323
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
Blazkowicz,

Спасибо.
...
Рейтинг: 0 / 0
27.02.2013, 19:30:10
    #38168581
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
А мне больше всего понравилась обработка эксцепшена. А что! Информативно...
...
Рейтинг: 0 / 0
28.02.2013, 03:26:02
    #38168940
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Проблема с антипаттерном
mayton,

текст условный.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / [Hibernate] Проблема с антипаттерном / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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