powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Использование Hibernate Serssion в MVC Spring3.
76 сообщений из 76, показаны все 4 страниц
Использование Hibernate Serssion в MVC Spring3.
    #38219598
Шаров Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу посоветоваться на счёт использования Hibernate Serssion в MVC Spring3.

Я пока знаю 3 способа открытия сессии Hibernate для получения данных в MVC.

1) Использование DAO слоя с функциями, которые возвращают готовые объекты, скрывая в себе открытия и закрытия hiber сессий и создание транзакций.

2) OSIW - Открытие hibernate сессии за каждый запрос.

3) Session Lond Conversation - Открытие Hibernate сессии на каждую сессиию (или чаще).

Моё приложение работает по принципу, получаю объект контроллером и храню его в HTTP сессии в фасадном объекте. Несколькими HTTP запросами работаю с объектом, потом сохраняю.

До сих пор, я использовал старый способ (1) - DAO, в Spring 3 есть аннотации @Transactional, которые упрощают настройку транзакций и автоматизируют открытие и закрытие hibernate сессии.

Недостаток данного способа:
- LazyException, если обращаешься к свойствам, которые не были загружены в DAO методах. Достало заботиться о глубине загрузки.
- Объекты (иногда даже одни и те же), могут быть открыты в разных Hibernate сессиях, что приводит к ошибке NonUniqueObjectException.

Использование (2) OSIW решает лишь часть проблем LazyException. Данный способ не рекомендуется :(.

Самым логичным в моём случае выглядит (3) способ Long Conversation. В данном случае о Lazy и NonUniqueObjectException можно будет забыть, т.к. всё будет в одной сессии.

Хотелось бы поинтересоваться, у тех кто пользовался Long Conversation.
Читал, что и этот способ не рекомендуется в MVC.

Интересует:
а) Нужно ли отключать Кеширование Hibernate?
Опасения. Я использую Oracle, который занимается кешированием, зачем кешровать и в СУБД и в WEB приложении? Потом, ресурсы. Кеширование, будет жрать память контейнера (tomcat в моём случае).
б) Я правильно понимаю, что при Session Long Conversation всё время будет открыто соединение с СУБД пока не закроется Hibernate сессиия ?!

Есть ли у кого рабочие примеры или ссылки или мысли какой же способ открытия сессии Hibernate лучше ?

Не знаю рабочий или нет, я нашёл пример, https://community.jboss.org/wiki/OpenSessionInView , где есть раздел "What about the extended Session pattern for long Conversations?"

Правильно я понимаю, что в HibernateSessionConversationFilter, сохранение данных производится при появлении в сессии атрибута END_OF_CONVERSATION_FLAG. Получается, ошибку сохранения не перехватить :(.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219625
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаров Сергей,
1) Загрузить объект
2) Перевести его в состояние detached
3) Положить его в сессию
4) Редактировать сколько угодно
5) Присоединить к сессии и сохранить изменения
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219640
rdm5) Присоединить к сессии и сохранить изменения

Не подскажете, как объект присоединить к сессии для сохранения?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219641
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищущий Знанияrdm5) Присоединить к сессии и сохранить изменения

Не подскажете, как объект присоединить к сессии для сохранения?
session.saveOrUpdate(detachedObject);
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219689
lvit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmИщущий Знанияпропущено...


Не подскажете, как объект присоединить к сессии для сохранения?
session.saveOrUpdate(detachedObject);
встречный вопрос а почему не session.merge(detachedObject); вы ему не советуете?
просто я думаю на будущее еще нужно ему узнать что такое оптимистическая(@Version) и пессимистическая блокировка!
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219866
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,
в среднем проекте объектов около 500
- не накладно руками всё это делать? Сколько строк кода? Не проще сессию не закрывать?
Об этом и был вопрос автора.
- объект в сессии должен быть VO?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219897
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lvitrdmпропущено...

session.saveOrUpdate(detachedObject);
встречный вопрос а почему не session.merge(detachedObject); вы ему не советуете?
просто я думаю на будущее еще нужно ему узнать что такое оптимистическая(@Version) и пессимистическая блокировка!
merge - это не присоединение объекта к сессии. Эта операция сначала делает загрузку объекта из базы, и затем меняет значение полей.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219913
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаров СергейХочу посоветоваться на счёт использования Hibernate Serssion в MVC Spring3.
Я пока знаю 3 способа открытия сессии Hibernate для получения данных в MVC.
Вы MVC зря сюда приплели. Он к вопросу отношения не имеет. Для любого другого использования ORM в Web, проблемы аналогичны. И не только в web, в 3-tier с толстым клиентом сложностей ещё больше.


Шаров Сергей1) Использование DAO слоя с функциями, которые возвращают готовые объекты, скрывая в себе открытия и закрытия hiber сессий и создание транзакций.
DAO метод это лишь маленький кирпич бизнес-транзакции. Бизнес-транзакция, обычно использует несколько различных методов DAO. И ассоциируется, чаще всего с одной транзакцией в БД. Именно это вы упускаете. Есть несколько способов реализовать такой метод: Service aka Transaction Script - stateless реализация бизнес-транзакции, Rich Domain Model - где бизнес логика максимально полностю реализована в Entity, и некоторая комбинация, которую часто практикуют в небольших решениях, это логика в MVC контроллере, который остальным не особо обременен.
Таким образом происходит управление транзакцией. А жизненый цикл Hibernate Session, в большинстве случаев, связан один в один с этой транзакцией.

Шаров Сергей2) OSIW - Открытие hibernate сессии за каждый запрос.

Первый раз вижу такую аббревиатуру. Вбиваем в гугле Open Session In View Antipattern и вдумчиво читаем статьи с детальным описанием недостатка этого подхода.

Шаров Сергей3) Session Lond Conversation - Открытие Hibernate сессии на каждую сессиию (или чаще).
Здесь всё как раз упирается в тип приложения. Например, если это highload, то нужно сессию на каждый клиентский запрос переподвязывать к новой транзакции, т.к. долгоиграющие транзакции сильно ограничивают производительность.
На форумах уже не раз жаловались что долгоживущие сессии Hibernate сам по себе не достаточно стабильно поддерживает в связи с обильным количесвом баг. Может что-то за последние годы поменялось.

Шаров СергейМоё приложение работает по принципу, получаю объект контроллером и храню его в HTTP сессии в фасадном объекте. Несколькими HTTP запросами работаю с объектом, потом сохраняю.
Что за "фасадный объект"? Копия entity отвязаная от инфраструктуры? Аналог DTO/Value Object? Фасадом, обычно, называют нечто другое.

Шаров СергейДо сих пор, я использовал старый способ (1) - DAO, в Spring 3 есть аннотации @Transactional, которые упрощают настройку транзакций и автоматизируют открытие и закрытие hibernate сессии.
И как вы выполняете несколько DAO методов в одной транзакции?

Шаров Сергей- LazyException, если обращаешься к свойствам, которые не были загружены в DAO методах. Достало заботиться о глубине загрузки.

На самом деле это вообще не сложно, если об этом позаботиться изначально при реализации сценария. А если не заботится о глубине загрузки, то у вас просядет производительность за счет кучи дополнительных SELECT запросов. Опять же, вы ничего не говорите о том в каком слое у вас это исключение вылазит. View?

Шаров Сергей- Объекты (иногда даже одни и те же), могут быть открыты в разных Hibernate сессиях, что приводит к ошибке NonUniqueObjectException.

Это да. Головняк.

Шаров СергейИспользование (2) OSIW решает лишь часть проблем LazyException. Данный способ не рекомендуется :(.

Есть такое.

Шаров СергейСамым логичным в моём случае выглядит (3) способ Long Conversation. В данном случае о Lazy и NonUniqueObjectException можно будет забыть, т.к. всё будет в одной сессии.

Надо попробовать. Но как быть с привязкой к транзакции?

Шаров Сергейа) Нужно ли отключать Кеширование Hibernate?

Как это? Зачем это? Почему такой вопрос?

Шаров СергейОпасения. Я использую Oracle, который занимается кешированием, зачем кешровать и в СУБД и в WEB приложении? Потом, ресурсы. Кеширование, будет жрать память контейнера (tomcat в моём случае).

Мда. С таким подходом можно сказать что у вас на CPU есть несколько уровней кешей, поэтому больше нигде ничего кешировать не нужно. Запросы к БД сами по себе дорогая операция. Не зависимо от того закешировала БД что-то или нет. Кеш помогает избегать запросов к БД значительно увеличивая производительность. То что кеш занимает память это стандартный trade-in в ПО вообще. Увеличение производительности достигается за счет использование большого количества памяти, чтобы ускорить доступ к данным. А уплотнение данных в памяти, приводит к лишней нагрузке на процессоры. Это всё логично.

Шаров Сергейб) Я правильно понимаю, что при Session Long Conversation всё время будет открыто соединение с СУБД пока не закроется Hibernate сессиия ?!

По-умолчанию - да. Что и является основным затыком. Скорее всего это можно решить. Как именно - не скажу.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219916
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123rdm,
в среднем проекте объектов около 500
- не накладно руками всё это делать? Сколько строк кода? Не проще сессию не закрывать?
Об этом и был вопрос автора.
- объект в сессии должен быть VO?
VO - это валуе объект? Я не большой специалист, но честно говоря не вижу каких либо сложностей в использовании hibernate, хотя в начале было жутко неудобно.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219928
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmЯ не большой специалист, но честно говоря не вижу каких либо сложностей в использовании hibernate, хотя в начале было жутко неудобно.
Основных проблем две. 1я - баги. 2я - "шаг влево, шаг вправо - расстрел". Хочется чего-то нестандартного. Готовься упорно бодаться с hibernate.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219942
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczrdmЯ не большой специалист, но честно говоря не вижу каких либо сложностей в использовании hibernate, хотя в начале было жутко неудобно.
Основных проблем две. 1я - баги. 2я - "шаг влево, шаг вправо - расстрел". Хочется чего-то нестандартного. Готовься упорно бодаться с hibernate.
Petro123в среднем проекте объектов около 500
У меня на порядок меньше, может поэтому проблем особых нет.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219966
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmУ меня на порядок меньше, может поэтому проблем особых нет.
да проблем особых ни у кого нет.
Есть 2 подхода, и ...годы спора и флейма:
- Lazy и контроль всего и вся
- OpenSession in View
Кстати, т.к. нет единого мнения, то это значит - ОБА решения РАБОТАЮТ.
И замечательно, что нет золотой пули.

Доп инфа по:
OpenSession in View :
http://www.rsdn.ru/forum/java/841539.1
Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
//фильтр
public class HibernateFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("Servlet Фильтр init, теперь Сеанс открытия/закрытия для каждого реквеста.");
    }
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        // Не существует на самом деле никаких явных открытых сессий, 
        // первый вызов HibernateUtil.beginTransaction () в control
        // logic (например, использование случае контроллер / обработчик события)
        // получит текущую сессию.
        try {
            chain.doFilter(request, response);
            HibernateSessionController.commitTransaction();// Завершить любые транзакции, если открыты
        } catch (SessionManagementException sme) {
             log.error(sme);
        } finally { // закрыть по любому
            try {
                HibernateSessionController.closeSession();
            } catch (SessionManagementException sme) {
                 log.error(sme);
            }
        }
    }
    public void destroy() {}
}

//менеджер-класс:
public class HibernateSessionController {
    private static Log logger = LogFactory.getLog(HibernateSessionController.class);
    private static Configuration configuration;
    private static SessionFactory sessionFactory;
    private static final ThreadLocal threadSession = new ThreadLocal();
    private static final ThreadLocal threadTransaction = new ThreadLocal();
    private static final ThreadLocal threadInterceptor = new ThreadLocal();
    // создать Default SessionFactory 
    static {
        try {
            configuration = new Configuration();
            sessionFactory = configuration.configure().buildSessionFactory();
        } catch (Throwable ex) {
            logger.error("Building SessionFactory failed.", ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    /**
     * Returns the SessionFactory used for this static class.
     *
     * @return SessionFactory
     */
    public static SessionFactory getSessionFactory() {
        /* Instead of a static variable, use JNDI:
        SessionFactory sessions = null;
        try {
            Context ctx = new InitialContext();
            String jndiName = "java:hibernate/HibernateFactory";
            sessions = (SessionFactory)ctx.lookup(jndiName);
        } catch (NamingException ex) {
            throw new InfrastructureException(ex);
        }
        return sessions;
        */
        return sessionFactory;
    }

    /**
     * Returns the original Hibernate configuration.
     *
     * @return Configuration
     */
    public static Configuration getConfiguration() {
        return configuration;
    }

    /**
     * Rebuild the SessionFactory with the static Configuration.
     *
     */
     public static void rebuildSessionFactory()
        throws SessionManagementException {
        synchronized(sessionFactory) {
            try {
                sessionFactory = getConfiguration().buildSessionFactory();
            } catch (Exception ex) {
                throw new SessionManagementException(ex);
            }
        }
     }

    /**
     * Rebuild the SessionFactory with the given Hibernate Configuration.
     *
     * @param cfg
     */
     public static void rebuildSessionFactory(Configuration cfg)
        throws SessionManagementException {
        synchronized(sessionFactory) {
            try {
                sessionFactory = cfg.buildSessionFactory();
                configuration = cfg;
            } catch (Exception ex) {
                throw new SessionManagementException(ex);
            }
        }
     }

    /**
     * Retrieves the current Session local to the thread.
     * <p/>
     * If no Session is open, opens a new Session for the running thread.
     *
     * @return Session
     */
    public static Session getCurrentSession()
        throws SessionManagementException {
        Session s = (Session) threadSession.get();
        try {
            if (s == null) {
                logger.debug("Opening new Session for this thread.");
                if (getInterceptor() != null) {
                    if (logger.isDebugEnabled())
                        logger.debug("Using interceptor: " + getInterceptor().getClass());
                    s = getSessionFactory().openSession(getInterceptor());
                } else {
                    s = getSessionFactory().openSession();
                }
                threadSession.set(s);
            }
        } catch (HibernateException ex) {
            throw new SessionManagementException(ex);
        }
        return s;
    }

    /**
     * Closes the Session local to the thread.
     */
    public static void closeSession()
        throws SessionManagementException {
        try {
            Session s = (Session) threadSession.get();
            threadSession.set(null);
            if (s != null && s.isOpen()) {
                if (logger.isDebugEnabled())
                    logger.debug("Closing Session of this thread.");
                s.close();
            }
        } catch (HibernateException ex) {
            throw new SessionManagementException(ex);
        }
    }
}


понятно, что спринг MVC4 молчит по данному вопросу...пока....
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219984
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmVO - это валуе объект? Я не большой специалист, но честно говоря не вижу каких либо сложностей в использовании hibernate, хотя в начале было жутко неудобно.
да.
Сложности с техническими низкоуровневыми вещами, которые должен делать фреймворк:
- следить за транзакциями, сессиями, областями видимости и подгрузкой объектов.
- запихивать в HTTP сессию объекты, не из-за хибера, а только когда надо хранить состояние между HTTP-сессимя-запросами (совсем другая БЛ).
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38219994
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123rdmУ меня на порядок меньше, может поэтому проблем особых нет.
да проблем особых ни у кого нет.
Есть 2 подхода, и ...годы спора и флейма:
- Lazy и контроль всего и вся
- OpenSession in View
Кстати, т.к. нет единого мнения, то это значит - ОБА решения РАБОТАЮТ.
И замечательно, что нет золотой пули.

Я сразу загружаю все необходимые данные(HQL или Criteria), так с LazyException проблем нет. Ведь все необходимые данные для загрузки из базы известны при запросе.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220020
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123rdmVO - это валуе объект? Я не большой специалист, но честно говоря не вижу каких либо сложностей в использовании hibernate, хотя в начале было жутко неудобно.
да.
Сложности с техническими низкоуровневыми вещами, которые должен делать фреймворк:
- следить за транзакциями, сессиями, областями видимости и подгрузкой объектов.
- запихивать в HTTP сессию объекты, не из-за хибера, а только когда надо хранить состояние между HTTP-сессимя-запросами (совсем другая БЛ).
Честно говоря не знаю как прокомментировать) Пока это для меня не очевидно.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220031
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmПока это для меня не очевидно.
14159487
зачем деаттачить объект? Будет код - будет очевидно.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220064
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаров Сергей,
Спасибо rdm - навел меня на мысли почему Session Long Conversation, возможно, и не нужен вообще.

Как происходит сценарий работы.
1) Юзер загружает данные из БД. - данные оседают в Level 2 Cache
2) Юзер вносит изменения и сабмитит в контроллер.
3) Контроллер по id достаёт объект из новой session, что происходит очень быстро и без обращений к БД, см п.1
4) Контроллер мержит форму или JSON в persistent object, средствами Spring MVC и других библиотек.
5) По коммиту Hibernate апдейтит все dirty свойства в базу - данные в Level 2 Cache обновляются
6) Повторять сколько угодно раз.

- Данные полностью читаются из базы только один раз, за все HTTP запросы.
- Апдейтиться только то что действительно поменялось.

Единственное большая разница с Session Long Conversation, что комит апдейтов в базу происходит при каждом апдейте из web, вместо того чтобы накапливать изменения в HTTP Session. Но это скорее даже преимущество, чем недостаток.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220095
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz3) Контроллер по id достаёт объект из новой session, что происходит очень быстро и без обращений к БД, см п.1
- В контроллере Бизнес-логика. Он не должен заниматься техническими вещами. Если сессия протухла (устарела, кем-то закрыта, ....), то этим должен заниматься хибер.
- Контроллёр пишет программист руками. Пишет же он аннотацию - @ЕслиНетТранзакцииТоНачатьНовую
- Хибер также должен решать - Merge ему делать или:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
update(), saveOrUpdate(), lock(), replicate() and merge() 
...
if ( session.contains( myEntity ) ) {
    // nothing to do... myEntity is already associated with the session
}
else {
    session.saveOrUpdate( myEntity );
}


ЗЫ.
Мир движется к межсетевому взаимодействию. И если делать (сессия протухла), то делать по человечески - без кода в БЛ.
Как например, сделан TClientDataSet в Delphi ))
IMHO
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220105
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz- Данные полностью читаются из базы только один раз, за все HTTP запросы.
тогда он никогда не увидит данные соседа после коммита.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220122
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- В контроллере Бизнес-логика. Он не должен заниматься техническими вещами. Если сессия протухла (устарела, кем-то закрыта, ....), то этим должен заниматься хибер.

Это вообще не важно. Где логика и кто чем занимается. Я просто описывают идею как оно должно работать. Кто такая протухшая сессия и какое отношение она имеет к моему сценарию я не знаю. Сессия, как и бизнес-транзакция, содаётся на каждый запрос..

Petro123- Контроллёр пишет программист руками. Пишет же он аннотацию - @ЕслиНетТранзакцииТоНачатьНовую

Эта аннотация лишь указание котейнеру. А что именно при этом происходит зависит от реализации и конфигурации контейнера. К моему сценарию отношения тоже не имее.

Petro123- Хибер также должен решать - Merge ему делать или:
[src java]
update(), saveOrUpdate(), lock(), replicate() and merge()
...
if ( session.contains( myEntity ) ) {
// nothing to do... myEntity is already associated with the session
}
else {
session.saveOrUpdate( myEntity );
}

Хибер никому ничего не должен.

Petro123Мир движется к межсетевому взаимодействию. И если делать (сессия протухла), то делать по человечески - без кода в БЛ. Как например, сделан TClientDataSet в Delphi ))IMHO
ROFL
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220130
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123тогда он никогда не увидит данные соседа после коммита.
Кто-то совсем запутался в архитектурах. Кэш один на сервер. Апдейты соседа его чудесно обновляют. Нет никакого кэша на юзера.
На кластере кеш чудесно реплицируется, так что даже в распределенной системе актуален.
Апдейтов не видно только если сосед, с**а, меняет прямо в базе, мимо сервера.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220134
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz 1) Юзер загружает данные из БД. - данные оседают в Level 2 Cache

есть с level2 одна очень неприятная фича . кстати предложенное решение в багтрекере у меня не работает, либо что-то поменялось с тех пор, либо у меня лыжи не едут. помогает только явное unproxy на все join fetch сущности.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220145
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaесть с level2 одна очень неприятная фича . кстати предложенное решение в багтрекере у меня не работает, либо что-то поменялось с тех пор, либо у меня лыжи не едут. помогает только явное unproxy на все join fetch сущности.
Это неприятная фича Hibernate в целом. Баги, которые никогда не будут исправлены, одна из его особенностей.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220163
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
>Сессия, как и бизнес-транзакция, содаётся на каждый запрос..
== хорошо бы, но топик и Lazy говорит не так.
Проблема есть или её нет?

>Эта аннотация лишь указание котейнеру. А что именно при этом происходит зависит от реализации и конфигурации контейнера. К моему сценарию отношения тоже не имее.
=== сценарий без кода и ответственных за работу. Что обсуждать. Может там 5 000 строк писать надо.
Как было с try{}

>Хибер никому ничего не должен.
==== да)))))

Про кэш ты прав и это ОФФТОП.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220183
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Blazkowicz,
>Сессия, как и бизнес-транзакция, содаётся на каждый запрос..
== хорошо бы, но топик и Lazy говорит не так.
Проблема есть или её нет?

У автора проблема в том что он транзакцию и сессию создаёт в DAO, а нужно на уровень выше, но не так глобально, как Open Session In View.

Petro123=== сценарий без кода и ответственных за работу. Что обсуждать. Может там 5 000 строк писать надо.
Как было с try{}
Не знаю о чем ты.

Petro123Про кэш ты прав и это ОФФТОП.
Это не Оффтоп. Автор спрашивает про Session Long Conversation подход. Я показываю почему этот подход не нужен из-за Level 2 Cache.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220192
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczУ автора проблема в том что он транзакцию и сессию создаёт в DAO, а нужно на уровень выше, но не так глобально, как Open Session In View.
замечательно.
Тогда почему, спринг управляет транзакциями декларативно.
Почему программист должен руками управлять связкой: СессияХибера ---СессияHTTP.
Если время жизни объектов явно выше одного запроса HTTP.

3. Тут кто-то говорил, что сессиями программисту лень заниматься. Они у него ВНИЗУ автоматом.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220194
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Нужно ли отключать Кеширование Hibernate?
Обязательно. Если данных мало и запросы хорошо ложатся в дисковый кэш СУБД, то СУБД без проблем выдерживает несколько десятков тысяч запросов в секунду на ноутбуке девелопера, и извращения с кэшем не нужны. Если данных много, то скажется, во-первых, жуткий оверхед по памяти, который в яве присутствует на каждый объект (сравните с ораклом, где даже целые числа имеют переменную длину для экономии каждого байта), а во-вторых, сборщик мусора будет все время перебирать этот кэш, что приведет к неслабым тормозам.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220201
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
хорошо бы конкретно, т.к. AFAIK по умолчанию 1кэш включен. Второй выключен.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220212
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1кэш включен. Второй выключен

Я второй имел в виду, первый выключить невозможно же.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220214
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Тогда почему, спринг управляет транзакциями декларативно.

Управляет транзакциями разработчик. Декларативное управление лишь один из инструментов. Вопрос в стиле "почему вода мокрая"?

Petro123Почему программист должен руками управлять связкой: СессияХибера ---СессияHTTP.

Почему программист вообще что-то должен делать? Наверное потому что ORM и Web это совершенно разные технологии. И каждый склеивает их как хочет. Не нравится Spring-клей? Берем Seam-клей или EJB-клей. Не нравится ничего готового? Пишем руками. Это везде так.

Petro123Если время жизни объектов явно выше одного запроса HTTP.

8) Время жизни объектов не важно. Время жизни сущностей в любом случае больше HTTP запроса.

Petro1233. Тут кто-то говорил, что сессиями программисту лень заниматься. Они у него ВНИЗУ автоматом.
Кто говорил? Где говорил? Именно такими словами?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220215
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ1кэш включен. Второй выключен

Я второй имел в виду, первый выключить невозможно же.
+1. Тоже читал, что второй часто в выкл
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220223
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123тогда он никогда не увидит данные соседа после коммита.
Кто-то совсем запутался в архитектурах. Кэш один на сервер. Апдейты соседа его чудесно обновляют. Нет никакого кэша на юзера.
На кластере кеш чудесно реплицируется, так что даже в распределенной системе актуален.
Апдейтов не видно только если сосед, с**а, меняет прямо в базе, мимо сервера.
Так получиться что 2 пользователя могут одновременно редактировать один объект?
Как я понял автора темы, ему требуется что-то типа пессимистической блокировки на продолжительное время.
Так что как по мне, лучше загрузить detached объект в HTTP сессию, редактировать его там, а при сохранение проверять версию.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220226
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪОбязательно. Если данных мало и запросы хорошо ложатся в дисковый кэш СУБД, то СУБД без проблем выдерживает несколько десятков тысяч запросов в секунду на ноутбуке девелопера, и извращения с кэшем не нужны.
Угу, а выполнение SQL запросов и передача данных между Java сервером и СУБД - бесплатная операция.

Йуный джавистЪЕсли данных много, то скажется, во-первых, жуткий оверхед по памяти
Кеширование это всегда "жуткий оверхед по памяти". Кеш с нулевым размером ещё пока не изобрели. Впрочем, как и вечный двигатель.

Йуный джавистЪкоторый в яве присутствует на каждый объект (сравните с ораклом, где даже целые числа имеют переменную длину для экономии каждого байта)
Планка памяти стоит меньше чем день работы Java программиста. А в облаке, возможно, ещё дешевле.

Йуный джавистЪа во-вторых, сборщик мусора будет все время перебирать этот кэш, что приведет к неслабым тормозам.
Проблеме уже много лет и она успешно решается. Off heap кеш, G1 сборщик.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220232
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmКак я понял автора темы, ему требуется что-то типа пессимистической блокировки на продолжительное время.
Так что как по мне, лучше загрузить detached объект в HTTP сессию, редактировать его там, а при сохранение проверять версию.
Нет. Автор темы лишь спрашивает об этом подходе, как о варианте решения своих проблем. Это не значит что оно ему нужно с точки зрения бизнес-требований. Скорее всего вообще не нужно, потому что уже что-то написано и работает без этого.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220234
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro1233. Тут кто-то говорил, что сессиями программисту лень заниматься. Они у него ВНИЗУ автоматом.
Кто говорил? Где говорил? Именно такими словами?
аффтар и говорил)
14121686
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220237
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему скажем просто нельзя добавить поле boolean lock в таблицу и установкой этого поля блокировать объект?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220239
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не по теме, просто интересно. Вместо всяких Select for update.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220257
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmSelect for update
это _один из методов_ блокировки самой СУБД. Это тоже галка в системных таблицах и снимается САМОЙ субд на коммит АВТОМАТОМ.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220263
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123rdmSelect for update
это _один из методов_ блокировки самой СУБД. Это тоже галка в системных таблицах и снимается САМОЙ субд на коммит АВТОМАТОМ.
Я про случай, когда объект нужно блокировать на более чем одну транзакцию.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220269
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,
тема ошибки Lazy из за того что "кто-то" закрыл сессию, а автоматом она не открывается,
и многопользовательская работа (кеш) - разные вопросы.
IMHO
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220275
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmЯ про случай, когда объект нужно блокировать на более чем одну транзакцию.
7 страниц))
Флейм для пользы - Как хранить Состояние в 3-х звенке или Есть ли SpringСостояние?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220285
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кеширование это всегда "жуткий оверхед по памяти". Кеш с нулевым размером ещё пока не изобрели. Впрочем, как и вечный двигатель
Я имел в виду, что в яве строка из одного символа занимает, кажется 30 байт, или около того.
Угу, а выполнение SQL запросов и передача данных между Java сервером и СУБД - бесплатная операция.
Практически бесплатная. Дорогой ресурс - дисковый ввод-вывод и конкуренция за лэтчи (которая никуда не исчезнет в варианте с явой).
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220292
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблеме уже много лет и она успешно решается. Off heap кеш, G1 сборщик.
И еще много лет будет успешно решаться.
А что, есть какой-то работающий off heap кэш для явы?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220298
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪА что, есть какой-то работающий off heap кэш для явы?
Помимо BigMemory? Любое внятное NoSQL хранилище.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220316
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помимо BigMemory? Любое внятное NoSQL хранилище.
Вы предлагаете, имея оракл, поставить впереди него какое-то NoSQL хранилище? Это мне напоминает анекдот про крестьян, которым показали трактор, объяснили, а они отвечают:
- Мы поняли, это все хорошо, внутреннее сгорание, бензин, но лошадь-то куда запрягать?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220331
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪПомимо BigMemory? Любое внятное NoSQL хранилище.
Вы предлагаете, имея оракл, поставить впереди него какое-то NoSQL хранилище? Это мне напоминает анекдот про крестьян, которым показали трактор, объяснили, а они отвечают:
- Мы поняли, это все хорошо, внутреннее сгорание, бензин, но лошадь-то куда запрягать?
Аналогия не уместна. Можете сколько угодно писать в каждой теме Java - говно, Oracle RDBMS - рулит. Сомневаюсь что автору темы это интересно.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220333
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете сколько угодно писать в каждой теме Java - говно
Ни в одной теме не писал такого.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220360
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу кеша первого уровня.
Можно сколько угодно спорить о его нужности.
Но пока программист не напишет волшебную фразу - сбросить в БД. А параллельный юзверь - перечатать из БД, изменения друг друга они не увидят.
Ведь так? Т.к. хранилище всё таки в БД, а не в хибере.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220379
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123по поводу кеша первого уровня.
Если разговор всё ещё о Hibernate, то "кеш первого уровня." это Session. Время жизни которого, в большинстве случаев, одна транзакция.

Petro123Можно сколько угодно спорить о его нужности.

Это не нужность. Это неизбежность. Или ты таки о втором уровне ?

Petro123Но пока программист не напишет волшебную фразу - сбросить в БД. А параллельный юзверь - перечатать из БД, изменения друг друга они не увидят.
Ведь так? Т.к. хранилище всё таки в БД, а не в хибере.
Разговор тракториста и мотоциклиста, блин. Юзеры не ходят в базу мимо кеша 2го уровня. Поэтому он всегда актуален.
Программист не пишет волшебных фраз параллельно с доступом юзера к БД.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220414
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
я только про 1-ый кеш - сессионный.
Да, он только на время транзакции или 0,01 сек.
Программист пишет flush() и закрывает сессию хибера. Так?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220424
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
ты прав, про сессионный кэш 1 уровня и разговаривать не стоит, т.к. он тривиален.
Гарантирует одинаковый объект в любом месте кода load(), find().
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220451
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, и делаем вывод:
- Кэш 2-го уровня по умолчанию выключен и офотоп
- Кэш 1 уровня равен транзакции.

ВИ
===
1 Читаем объект http\\сервлет ФИО=Вася, Рост=165)
1.1 конец транзакции - всё закрыли

2 Пользователь исправил рост на 182 и и нажал ОК (старт и конец трпанзакции за 0,01 сек)
http\\сервлет ФИО=Вася, Рост=182)
2.1 конец транзакции - всё закрыли

Вопрос ламерский - где тут Lazy? Зачем деаттачить объект и пихать его в сессию?
Если было 2 транзакции по 0,01 сек.

Ждём аффтара?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220467
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Ждём аффтара?
Они никогда не возвращаются.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220471
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Blazkowicz!

>> Ждём аффтара?
> Они никогда не возвращаются.

.... сказал он, поглаживая шарфик :)

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38220496
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_Samara,
))))))))
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222187
Шаров Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Ну, и делаем вывод:
ВИ
===
1 Читаем объект http\\сервлет ФИО=Вася, Рост=165)
1.1 конец транзакции - всё закрыли

2 Пользователь исправил рост на 182 и и нажал ОК (старт и конец трпанзакции за 0,01 сек)
http\\сервлет ФИО=Вася, Рост=182)
2.1 конец транзакции - всё закрыли

Вопрос ламерский - где тут Lazy? Зачем деаттачить объект и пихать его в сессию?
Если было 2 транзакции по 0,01 сек.


Мой вывод такой.
1) Я понял, что использую правильную схему (для своего варианта), а именно Detach Value Object, который я получаю из DAO. Использовать OSIV и Long Conversation - это оффтоп и проблемы производительности в будущем. С Lazy придётся бороться, загружая объекты до нужного уровня "вручную".

2) У меня есть огромные пробелы с пониманием как организовывать сложные транзакции, буду изучать. Но, в моём частном случае - где одна СУБД, я буду использовать метод одна транзакция - одна сессия Hibernate, на каждый метод DAO. Меня полностью устраивает механизм aop и annotation transaction.

==================

Хотелось бы сделать так, чтобы можно было редактируя объект, перейти к редактированию вложенных объектов, подгрузив ajax-ом новый view не перезагружая страницу пользователя. Потом в новом view ещё view и т.д. Представляя клиенту подобие толстого клиента и удобного представления данных для редактирования без перегрузки страниц.

Для этого
- хранить объект в model (я его, наверное, не правильно называл фасад) и удалённое редактирование ajax-ом свойств объектов находящихся в model.
- Никаких submit.

Это позволяет добиться боле дружественного интерфейса и надеюсь сократить время разработки.


Например
--------------------

1) Запрос http://сервлет/контролле1? ID=1 & view= ViewObject & context=root_object.
При этом объект сохраняется в сессии пользователя в Model в HashMap "contexts", например, contexts[root_object] .

2) Ответ содержание ViewObject размещаем на странице клиента (ajax.load)

3) ViewObject содержит <form:form modelAttribute='facade' />
<form:input name='contexts[root_object].property1' />.
<form:input name='contexts[root_object].property2' />.
Имеем свойство LIST вложенных объектов.
<c:forEach var='row' items='${facade.contexts[root_object].property2}' />
Показываем клиенту ГРИД.

3.1) value полям устанавливается автоматически Springom MVC. Не обязаельно. Например, combobox содержание элемента загружает сам при помощи самописного widget.combobox.

3.2) Никаких submit. Далее управляем только ajax-ом.
А именно на поля формы вешаются события типа change, которые посылают ajax команды "set" (json объекты с данными), которые улетают контроллеру validator. Контроллер получил абсолютное имя свойства и записал туда значения используя (BeanCommons).
Он получает список всех элементов формы, значений и отдельно имя свойства, на котором событие случилось. Назад прилетают ошибки - если есть - результат валидации.

Кнопка save опять-таки ajax запрос контроллеру сделать saveOrUpdate для нужного объекта из contexts. Как было сказано, присоединяет VO объект к сессии и сохраняет.

====================
Все view работают с одним model, но у каждого view свой объект в model.
А это значит, что на странице клиента можно разместить много страниц. И подгружать страницы без submit, используя ajax.load. Как раз при этом и может возникнуть ситуация, когда загруженный в model объект не полностью загружен. Но с этим я понял как бороться - руками.
Это позволяет делать деревья вложенных форм и т.п.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222231
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаров Сергей2) У меня есть огромные пробелы с пониманием как организовывать сложные транзакции, буду изучать. Но, в моём частном случае - где одна СУБД, я буду использовать метод одна транзакция - одна сессия Hibernate, на каждый метод DAO. Меня полностью устраивает механизм aop и annotation transaction.

У вас транзакция начинается и заканчивается в DAO. Вам нужно её область видимости расширить на остальную логику. Но не так широко как OpenSessionInView.

Шаров СергейХотелось бы сделать так, чтобы можно было редактируя объект, перейти к редактированию вложенных объектов, подгрузив ajax-ом новый view не перезагружая страницу пользователя. Потом в новом view ещё view и т.д. Представляя клиенту подобие толстого клиента и удобного представления данных для редактирования без перегрузки страниц.
Для этого
- хранить объект в model (я его, наверное, не правильно называл фасад) и удалённое редактирование ajax-ом свойств объектов находящихся в model.
- Никаких submit.
Это позволяет добиться боле дружественного интерфейса и надеюсь сократить время разработки.

К задаче работы с Hibernate это всё никакого отношения не имеет вообще. Hibernate-у абсолютно всё равно перегружал пользователь страницу, или просто послал AJAX запрос. Его это вообще никак не касается. Постарайтесь отделить одно от другого и не мешать всё в кашу.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222358
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаров СергейХотелось бы сделать так, чтобы можно было редактируя объект, перейти к редактированию вложенных объектов
Это длинная бизнес-транзакция со всеми вытекающими.
Так называемый "пошаговый мастер" в вебе не приветствуется.

Хотя можно написать всё))
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222376
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаров СергейНапример
--------------------
я так понял, вы серверный программист? ГУИ ни разу не писали? Руками его будете писать?
Почему то в Java часто для сервера используют 5 фреймворков. Для ГУИ - ни однго.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222589
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы сделать так, чтобы можно было редактируя объект, перейти к редактированию вложенных объектов, подгрузив ajax-ом новый view не перезагружая страницу пользователя. Потом в новом view ещё view и т.д. Представляя клиенту подобие толстого клиента и удобного представления данных для редактирования без перегрузки страниц.
Для этого
- хранить объект в model (я его, наверное, не правильно называл фасад) и удалённое редактирование ajax-ом свойств объектов находящихся в model.
- Никаких submit.
Это позволяет добиться боле дружественного интерфейса и надеюсь сократить время разработки.

То, что вы хотите, можно (и нужно) делать без аякса.
Проблема аякса в том, что аякс без клиентских MVC фреймворков приводит к типичной jQuery лапше, в которой код загажен DOM-манипуляциями, и любые изменения безнадежно все ломают. Аякс с клиентскими MVC фреймворками позволяет писать нормальный код, но эти фреймворки надо еще изучить, что требует времени.
Как бы я делал интерфейс с вложенными сущностями:
Интерфейс строится как последовательное редактирование JSON дерева. Каждая страничка somewebapp/edit_some_entity получает через пост параметры текущий JSON и URL возврата. Если пользователь жмет отмену редактирования, то она просто репостит JSON по адресу возврата. Если редактирование произошло успешно, то она добавляет данные в JSON и репостит по адресу возврата обновленный JSON. Таким образом, при переходе на страничку с редактированием вложенной сущности, вы передаете в нее текущий JSON документ и текущий url как адрес возврата. В сессии хранить ничего не надо, лучше записывать в hidden input и таким образом таскать за собой через пост параметры.
Таким образом, вы получаете отличную отладочную среду. В веб-консоли браузера вы всегда видите, что ушло от вас и что пришло, и у вас сохраняется вся история последних HTTP запросов.
Важно, что до поры до времени все данные у вас должны моделироваться как JSONObject. Всякие детачнутые сущности - это черный ящик и борьба с багами хибернейта. Когда настает время закомитить все в базу, то перекладываете из JSONObject в entity и сохраняете.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222722
Шаров Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Шаров СергейНапример
--------------------
я так понял, вы серверный программист?

Ты попал в точку. Я действительно серверный программист и как можно дольше отбивался от ГУИ. Т.к. приходится не только разрабатывать, но и сопровождать продукты, в том числе и разработанные самим. Чтобы сопровождение не сожрало все время, приходилось прятаться от ГУИ (Бухгалтеров) и создавать серверные решения не требующие сопровождения.

Но в последнее время понадобился ГУИ.

Petro123ГУИ ни разу не писали? Руками его будете писать?
Почему то в Java часто для сервера используют 5 фреймворков. Для ГУИ - ни однго.


Уже практически всё готово и ... руками :).
Наверное, потому, что разобраться в ГУИ фраймворке гораздо сложнее (по времени), чем написать свой ;).

Например, озадачился я тем, что мне нужен Grid.

Первое, что запросил в нете - рейтинг фраймворков. Оказалось, на первом месте jquery и чистый js. Т.к. в последнее время много исследований было потрачено именно на jQuery, то скачал популярный jqGrid - запустил на своем примере - получил полную лажу - не работающий пример :(. При этом ничего сложного я от этого грида не требовал, просто отразить список. Получил список одного серого цвета без возможности выбора. Интерес к данному продукту пропал.

Затем увидел Grid из Ext4Js, запустил - работает! Хорошая документация, с работающими примерами, хорошая настройка, но
1) много уже было написано на Jquery и не понятно как совмещать jquery и Ext4js вместе
2) на изучение Ext4js потребуется больше времени, чем есть на окончание прокта :(.
3) Ext4js - крут и работает на IE6+ (:)), но по оценкам специалистов, очень тяжёл для интернета (за счёт гибкости).
Зачем вкладывать силы в изучение фраеймворка только для интрАнета ?!

В итоге за 2 дня написал свой Грид (jquery.widget) и работающий так как мне нужно, по аналогии с гридом от EXt4JS. В отличии от Ext4js grid, обновляет только одну запись, а не перегружает все записи страницы. Поддерживает вложенные страницы редактирования элементов (мои view). Постраничный просмотр - страница вперёд, назад, в конец, назад, произвольная страница - сделал за 4 часа и главное получил колосальное удовольствие :). Добавление фильтров - не проблема, сортировка на стороне клиента - не буду делать. Зато можно использовать любой вид для списка - не обязательно таблица, а, например. UL список. Хотя думаю, чтобы уменьшить кол-во настроек сделаю <table/> по умолчанию.

За два дня готов combobox (проперти - объект) и ещё за два combolist (проперти LIST объект). Как я уже описывал примитивные проперти уже синхронизируются.

Сейчас пробую применять наработки и исправлять ошибки.

В итоге получился свой "фреймворк", который готов для использования и время придётся тратить не на изучение чужого кода с сотнями не нужных _пока_ свойств, а на развитие своего с нужными свойствами.

На счёт того, что использование Ajax только запутает код страницы, отвечу, что сейчас код получается не намного сложнее чем обычные <from:элементы> spring MVC, но получается с человеческим лицом: combobox, combolist, grid и валидация в контроллере, со всеми вытекающими и без перезапросов submit - что намного приятнее для человека, ихмо.

Например, combobox выливается в

<form:label path='context[currentService].executeRoles' >Список ролей:</form:label>
<div name='context[currentService].executeRoles'
jcombobox_url='context_autocomplete.do'
jcombobox_sql='list_roles'
jcombobox_validate_class='ObjRole' />
<br/>

и

<script>

$("[name='context[currentService].executeRoles']").combobox_sql( {
// Как показывать объект и загружает значения
showItem: function( item ) { return { id: item.id, label: item.name+"-"+item.text }; }
});

<.script>

Естественно есть js код проверяющий jcombobox_url и делающий из div-ов widget.combobox_sql.


Grid в идеале будет содержать описание колонок и имя property из model типа List.

Всем большое спасибо, за помощь, буду курить Ваши советы ещё долго.

Надеюсь на будущее сотрудничество, с уважением Сергей Шаров.Petro123Шаров СергейНапример
--------------------
я так понял, вы серверный программист?

Ты попал в точку. Я действительно серверный программист и как можно дольше отбивался от ГУИ. Т.к. приходится не только разрабатывать, но и сопровождать продукты, в том числе и разработанные самим. Чтобы сопровождение не сожрало все время, приходилось прятаться от ГУИ (Бухгалтеров) и создавать серверные решения не требующие сопровождения.

Но в последнее время понадобился ГУИ.

Petro123ГУИ ни разу не писали? Руками его будете писать?
Почему то в Java часто для сервера используют 5 фреймворков. Для ГУИ - ни однго.


Уже практически всё готово и ... руками :).
Наверное, потому, что разобраться в ГУИ фраймворке гораздо сложнее (по времени), чем написать свой ;).

Например, озадачился я тем, что мне нужен Grid.

Первое, что запросил в нете - рейтинг фраймворков. Оказалось, на первом месте jquery и чистый js. Т.к. в последнее время много исследований было потрачено именно на jQuery, то скачал популярный jqGrid - запустил на своем примере - получил полную лажу - не работающий пример :(. При этом ничего сложного я от этого грида не требовал, просто отразить список. Получил список одного серого цвета без возможности выбора. Интерес к данному продукту пропал.

Затем увидел Grid из Ext4Js, запустил - работает! Хорошая документация, с работающими примерами, хорошая настройка, но
1) много уже было написано на Jquery и не понятно как совмещать jquery и Ext4js вместе
2) на изучение Ext4js потребуется больше времени, чем есть на окончание прокта :(.
3) Ext4js - крут и работает на IE6+ (:)), но по оценкам специалистов, очень тяжёл для интернета (за счёт гибкости).
Зачем вкладывать силы в изучение фраеймворка только для интрАнета ?!

В итоге за 2 дня написал свой Грид (jquery.widget) и работающий так как мне нужно, по аналогии с гридом от EXt4JS. В отличии от Ext4js grid, обновляет только одну запись, а не перегружает все записи страницы. Поддерживает вложенные страницы редактирования элементов (мои view). Постраничный просмотр - страница вперёд, назад, в конец, назад, произвольная страница - сделал за 4 часа и главное получил колосальное удовольствие :). Добавление фильтров - не проблема, сортировка на стороне клиента - не буду делать. Зато можно использовать любой вид для списка - не обязательно таблица, а, например. UL список. Хотя думаю, чтобы уменьшить кол-во настроек сделаю <table/> по умолчанию.

За два дня готов combobox (проперти - объект) и ещё за два combolist (проперти LIST объект). Как я уже описывал примитивные проперти уже синхронизируются.

Сейчас пробую применять наработки и исправлять ошибки.

В итоге получился свой "фреймворк", который готов для использования и время придётся тратить не на изучение чужого кода с сотнями не нужных _пока_ свойств, а на развитие своего с нужными свойствами.

На счёт того, что использование Ajax только запутает код страницы, отвечу, что сейчас код получается не намного сложнее чем обычные <from:элементы> spring MVC, но получается с человеческим лицом: combobox, combolist, grid и валидация в контроллере, со всеми вытекающими и без перезапросов submit - что намного приятнее для человека, ихмо.

Например, combobox выливается в

<form:label path='context[currentService].executeRoles' >Список ролей:</form:label>
<div name='context[currentService].executeRoles'
jcombobox_url='context_autocomplete.do'
jcombobox_sql='list_roles'
jcombobox_validate_class='ObjRole' />
<br/>

и

<script>

$("[name='context[currentService].executeRoles']").combobox_sql( {
// Как показывать объект и загружает значения
showItem: function( item ) { return { id: item.id, label: item.name+"-"+item.text }; }
});

<.script>

Естественно есть js код проверяющий jcombobox_url и делающий из div-ов widget.combobox_sql.


Grid в идеале будет содержать описание колонок и имя property из model типа List.

Всем большое спасибо, за помощь, буду курить Ваши советы ещё долго и постараюсь применить в новом проекте.

Надеюсь на будущее сотрудничество, с уважением Сергей Шаров.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222783
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаров Сергей,
вроде всё разумно пишешь))). Правда немного оторвано от реалий, как будто писал на острове)...и всё время руками ;).
Если серверный, тогда почему такой ламерский вопрос-сабж про Lazy?
авторНаверное, потому, что разобраться в ГУИ фраймворке гораздо сложнее (по времени), чем написать свой ;).
Вообще, это свойство характера), а не аксиома.
Вот, по тебе видно, что ты уже всё решил ещё до написания вопроса на форуме).
Да, в небольшом проекте - быстрее напишешь. Но, Rich уровня SmartGWT - нет.
.....
Так что, работать будут все твои 3 варианта). Дьявол кроется в деталях.
ЗЫ.
Про длинные транзакции.
Если в десктоп, всё под полным контролем, и мы всегда знаем когда дать Rollback.
То в ослике всё сложнее (асинхронность, псевдомодальность и т.д.).
Поэтому, нравится или не нравится, но ГУИ десктоп \ веб \ андроид - везде другой.
imho
Удачи!
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222798
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге получился свой "фреймворк", который готов для использования и время придётся тратить не на изучение чужого кода с сотнями не нужных _пока_ свойств, а на развитие своего с нужными свойствами.
А вы выложите его на гитхаб. Куча примеров, когда люди делали микрофреймворки, которыми потом пользовались куча людей, например Backbone.js (там тысяча строк всего, при этом 5000000 упоминаний в гугле).
Пока непонятно, где у вас модель хранится. Я правильно понимаю, что компоненты сами запрашивают ее с сервера, и она неявно хранится внутри компонентов?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222807
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, в небольшом проекте - быстрее напишешь. Но, Rich уровня SmartGWT - нет.
Ты просто начинал с GUI, поэтому тебе кажется что GUI круче html и ты всегда будешь все сравнивать с GUI. На западе, например, спецы которые начинали с IBM 3270, с радостью восприняли появление web. Том Кайт писал что ему больше нравятся web интерфейсы чем GUI. Я недавно делал мелкие доработки в свинг интерфейсе, мне показалось неудобно, странные лэйауты, отсутствие инструментов типа инспекторов html. Это все субъективно, конечно, я просто хочу обратить внимание, что есть куча людей, в том числе старой школы, для которых GUI - не идеал.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222811
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
я тебя не понял.
- ГУИ - есть всегда (прокладка между пользователем).
- ГУИ может быть в любом виде (html \ exe_win \ exe_DOC \ )
- т.е. ГУИ это контролы.

Если понимать твою опечатку под Rich.
То увы, табличка в веб с сортировкой, группировкой, фильтрами - быстро нравится пользователям.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222813
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Йуный джавистЪ,
я тебя не понял.
- ГУИ - есть всегда (прокладка между пользователем).
- ГУИ может быть в любом виде (html \ exe_win \ exe_DOC \ )
- т.е. ГУИ это контролы.

Если понимать твою опечатку под Rich.
То увы, табличка в веб с сортировкой, группировкой, фильтрами - быстро нравится пользователям.
Я думаю речь шла о том, что многим удобнее делать пользовательский интерфейс использую html/css/js, чем к примеру Swing.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38222898
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,
Десктоп и Веб сравнивать сложно.
Они параллельные.
Как нельзя сказать что девочки хуже / лучше мальчиков.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223013
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123rdm,
Десктоп и Веб сравнивать сложно.
Они параллельные.
Как нельзя сказать что девочки хуже / лучше мальчиков.
А можно сказать что удобнее? )
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223108
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,
OFF
удобнее кому? Админу? Пользователю? Программисту?
Или всем сразу))?
..
В ТЗ пишется время отклика программы 0,1 сек.....
Уже одно это ставит под вопрос веб.
А программисту пофиг на чём писать (если он стремится к этому).
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223206
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123В ТЗ пишется время отклика программы 0,1 сек.....
Уже одно это ставит под вопрос веб. натурально? смотря как делать
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223219
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
am_sasaPetro123В ТЗ пишется время отклика программы 0,1 сек.....
Уже одно это ставит под вопрос веб. натурально? смотря как делать
конечно) + за какие деньги и каким профи по веб-гуи.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223595
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ТЗ пишется время отклика программы 0,1 сек.....

Ну, не надо писать в ТЗ лажу. С latency в 100мс можно в онлайн шутеры играть.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223631
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
off
Йуный джавистЪС latency
Аналитики таких страшных слов не знают))).
Справочник аптечного киоска - в деревне Пупкино - заказ лекарств по списку 50 000 наименований.
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223930
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторАналитики таких страшных слов не знают))).
Как они тогда измерят, что это именно 100мс а не 300 мс? К тому же, с чего это GUI будет быстрее чем web? За счет бинарных протоколов? А какой-нибудь оракл клиент в деревне пупкино аналитик будет устанавливать?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223972
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
ну что ты усложняешь?
ВИ
====
- Десктоп клиент. Девчушка набирает лекарство вслепую на клаве. Поиск на onChange текст.
- как нашлось - Enter
- фокус на кол-во, ввела штук и опять Enter
Включила модем Dial-UP, но к вопросу это отношение не имеет.
- отправила заказ на 400 наименований.
- утром привезли.
........
О чём спор? Что десктоп программы не нужны?
...
Рейтинг: 0 / 0
Использование Hibernate Serssion в MVC Spring3.
    #38223977
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
я так понимаю, на Java можно писать программы от для-Холодильника до 3D игры)))
Или опять будем заужать и шоры надевать?
...
Рейтинг: 0 / 0
76 сообщений из 76, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Использование Hibernate Serssion в MVC Spring3.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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