Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate: считываются старые данные 
:(
    Опции темы
vns955
Дата 13.2.2010, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Всем здрям!

Я использую Spring MVC. После формы редактирования некот. таблицы я вызываю форму отображения этой таблицы (контроллер SOListController). Т.е. я попадаю на formBackingObject метод:

Код

    protected Object formBackingObject(HttpServletRequest request)
    {
        ...
        // Здесь считываются старые данные
        List soList = soManager.getSOByParameters(searchByNumber, searchByItem, convDate);
        ...
    }


Код метода getSOByParameters:

Код

    public List getSOByParameters(String number, String item, String date)
    {
        Session session = HibernateUtil.getSessionFactory()
        .getCurrentSession();
        session.beginTransaction();
        List soList = null;
        try
        {
            soList = session.createCriteria(Salesorder.class)
                    .add(Restrictions.sqlRestriction("{alias}.number like ?", 
                                "%" + number + "%", Hibernate.STRING))
                    .add(Restrictions.sqlRestriction("{alias}.date like ?", 
                                "%" + date + "%", Hibernate.STRING))
                    .addOrder(Order.desc("date"))                    
                    .createCriteria("itemId")
                    .add(Restrictions.like("name", "%" + item + "%"))
                    .list();
            
            //session.flush();
            session.getTransaction().commit();
        }
        catch (HibernateException e)
        {
            session.getTransaction().rollback();
            throw e;
        }
        
        return soList;        
    }


Что самое странное, когда я нажимаю обновить в браузере и снова попадаю в formBackingObject метод, то тут уже считывается то что надо  
Для любых манипуляций с БД использую исключительно Hibernate и делаю везде commit(). Что ещё удивляет, я в проекте использовал уже аналогичное отображение данных (даже запрос очень похож), только с другой таблицей, и там все ОК 
Для отладки и разработки использую Eclipse Galileo. ORM: Hibernate 3.0. 
Подскажите плз в чем тут дело.

Заранее спасибо!
PM MAIL   Вверх
MaxPayneC
Дата 13.2.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Рекомендую сохранить в классе HibernateUtil SessionFactory один раз, например в блоке static { }. И второе, не как рекомендация, а просто для справки - лично я получал сессию вызовом openSession() и закрывал ее после окончания работы.
PM   Вверх
garbuz
Дата 14.2.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



vns955, раз уж используете спринг, то используйте его и для работы с хибернейтом, вам не придется создавать сессии в ручную.
Опишите еще раз ситуацию, только чуть понятнее smile Перед этим можно почитать про воркфлоу СимплФормКонтроллера, возможно у вас понимание не совсем верное. 
PM MAIL   Вверх
vns955
Дата 14.2.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



SOListController - контроллер для вывода на экран записей некотор. таблицы Salesorder.  Метод formBackingObject кидает эти строки (список) на jsp, ну а там уже JSTL рулит. Но эта страница просмотра имеет также кнопку Add New Sales Order и соотв. кнопки Edit возле каждой существующей записи для правки. Так вот, если я нажимаю Add New либо Edit для редактирования существующей записи, то я попадаю в соответствующие другие контроллеры (наприм. Edit) и после правки, наприм. записи и сохранения я попадаю снова в SOListController (так и задумано), но там я вижу не сохраненную запись, а старую (до редактирования). Причем в базе уже измененная запись (смотрю через MySQL concole клиент). Возможность кеширования бразуером и т.п. исключено, т.к. через отладчик я попадаю в formBackingObject и там вижу что берутся через метод getSOByParameters старые данные.
То же можно сказать и о добавлении записи, я ее тоже не вижу в форме просмотра.

Вот фрагмент из конфигурации spring:

Код

    <prop key="/solist.htm">soListController</prop>
    <prop key="/viewso.htm">viewSOController</prop>                    
    <prop key="/addso.htm">addSOController</prop>            
    <prop key="/editso.htm">editSOController</prop>                

    <bean name="soListController"
        class="com.account.controller.SOListController">
        <property name="sessionForm">
            <value>true</value>
        </property>
        <property name="commandClass">
            <value>com.account.form.SOList</value>
        </property>
        <property name="formView">
            <value>solist</value>
        </property>
        <property name="successView">
            <value>redirect:solist.htm</value>
        </property>
        <property name="soManager">
            <ref bean="soManager" />
        </property>
    </bean>    

    <bean name="editSOController"
        class="com.account.controller.EditSOController">
        <property name="sessionForm">
            <value>true</value>
        </property>
        <property name="commandClass">
            <value>com.account.form.SOEdit</value>
        </property>
        <property name="formView">
            <value>editso</value>
        </property>
        <property name="successView">
            <value>redirect:solist.htm</value>
        </property>
        <property name="soManager">
            <ref bean="soManager" />
        </property>
        <property name="customerManager">
            <ref bean="customerManager" />
        </property>            
        <property name="itemManager">
            <ref bean="itemManager" />
        </property>            
    </bean>        

PM MAIL   Вверх
garbuz
Дата 14.2.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(vns955 @  14.2.2010,  18:44 Найти цитируемый пост)
Метод formBackingObject кидает эти строки (список) на jsp, ну а там уже JSTL рулит

Во-первых, метод formBackingObject в большинстве случаев предназначен для возврата объекта формы - нового, существующего. 
Во-вторых, чтобы доставать все данные ваших сущностей, для их отображения например в таблице, используйте метод referenceData.
В-третьих, не стоит плодить множество контроллеров для работы с одной сущностью, можно и одним обойтись, если сразу одним не получится, то двумя.
В-четвертых, попробуйте в конфиге sessionForm указать как false.

PM MAIL   Вверх
vns955
Дата 14.2.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Цитата

В-третьих, не стоит плодить множество контроллеров для работы с одной сущностью, можно и одним обойтись, если сразу одним не получится, то двумя.

Дык, контроллер я один использую EditSOController для добавления и редактирования, а бины разные. Ну а на просморт записей - другой, а по другому имхо никак, потому что задачи разные и логика соот-но.

Добавлено через 5 минут и 54 секунды
Получилось когда я заюзал openSession(). 
Почему так? Теперь я по всему проекту должен изменить?
Я делал по книге Agile Java Development with Spring, Hibernate and Eclipse, Anil Hemrajani там именно было так (getCurrentSession()). Получается ошибка?


PM MAIL   Вверх
MaxPayneC
Дата 28.2.2010, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Разница в том, что openSession() гарантированно создает новую сессию, т.е. "читает" состояние базы данных, а getCurrentSession
Цитата
Obtains the current session. The definition of what exactly "current" means controlled by the CurrentSessionContext impl configured for use.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.