Почему мой урок закрывается? - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь обновить таблицу в моем сеансе гибернации, а затем обновить локальную таблицу данных путем повторного получения таблицы гибернации. Если я не делаю обновление, я могу без проблем обновить локальную таблицу данных, но когда я добавляю обновление, я получаю следующую ошибку в журнале сервера:

SEVERE: org.hibernate.SessionException: сессия закрыта!

Может кто-нибудь подсказать, что я делаю неправильно и что я могу сделать, чтобы решить проблему?

Спасибо.

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

public int updatePolygonGroupAtrributes( long id, String groupName, String color, long ownerId, int updtUserId )
{
    int stat = 0;
    TbPolygonGroup polyGroup = null;
    TbCustAccount custAcct = null;
    TbUser user = null;

    try
    {
        org.hibernate.Transaction tx = session.beginTransaction();
        polyGroup = (TbPolygonGroup)session.get(TbPolygonGroup.class, id);
        polyGroup.setVcPolygonGroup(groupName);
        polyGroup.setVcColor(color);
        custAcct = (TbCustAccount)session.get(TbCustAccount.class, ownerId);
        System.out.println( "<DbHelper.updatePolygonGroupAtrributes> ownerId = "+custAcct.getBiAccountId()+", Name = "+custAcct.getVcCustAccountName() );
        polyGroup.setTbCustAccount(custAcct);
        polyGroup.setDtUpdTime( new Date() );
        user = (TbUser)session.get(TbUser.class, updtUserId);
        System.out.println( "<DbHelper.updatePolygonGroupAtrributes> update User Id = "+user.getIuserId()+", Name = "+user.getVcUserFirstName()+" "+user.getVcUserLastName() );
        polyGroup.setTbUser(user);
        try
        {
            session.update(polyGroup);
            tx.commit();
            stat = 1;
        }
        catch(Exception e)
        {
            tx.rollback();
            e.printStackTrace();
            status = e.getMessage();
            stat = -1;
        }
    }
    catch( Exception ex )
    {
        ex.printStackTrace();
        status = ex.getMessage();
        stat = -1;
    }
    return stat;
}

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

public void polyGroupUpdateAction()
{
    int changed = 0;
    String clr = "#"+polyColor;
    long ownId = sb1.getLong( selectedPolyOwner, 0 );
    long groupId = selectedPolygonGroup.getBiPolygonGroupId();
    int updUserId = sb1.getLoginUserId();
    int retVal = dbHelper.updatePolygonGroupAtrributes(groupId, polyName, clr, ownId, updUserId);
    if( retVal < 0 )
    {
        sb1.setMessage( "Error updating Polygon Group: "+dbHelper.getStatus() );
        return;
    }
    System.out.println("---------<DeviceSessionBean.polyGroupUpdateAction> Return value = "+retVal);
    sb1.setMessage("Polygon Group has been updated.");
    fillPolyGroupList();
    return;
}

Вот соответствующий код, где я пополняю свои локальные таблицы (показывает, где происходит ошибка)

public void fillPolyGroupList()
{
    System.out.println( "<DeviceSessionBean.fillPolyGroupList> Entering ... ");
    tbPolygonGroupList = dbHelper.getPolygonGroup();
    System.out.println( "<DeviceSessionBean.fillPolyGroupList> After reloading polygon group list ... ");
    polygonGroupDataModel = new PolygonGroupDataModel(tbPolygonGroupList);
}

Вот журнал сеанса, который показывает, что обновление успешно завершено, но выдает ошибку, когда я пытаюсь перечитать таблицу данных в fillPolyGroupList ();

INFO: <DbHelper.updatePolygonGroupAtrributes> ownerId = 74, Name = TransCore - David Kerr
INFO: <DbHelper.updatePolygonGroupAtrributes> update User Id = 2, Name = Transcore System
INFO: ---------<DeviceSessionBean.polyGroupUpdateAction> Return value = 1
INFO: <DeviceSessionBean.fillPolyGroupList> Entering ... 
SEVERE: org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1319)
.....
at java.lang.Thread.run(Thread.java:662)

INFO: <DeviceSessionBean.fillPolyGroupList> After reloading polygon group list ... 
WARNING: #{deviceSessionBean.polyGroupUpdateAction}: java.lang.NullPointerException
javax.faces.FacesException: #{deviceSessionBean.polyGroupUpdateAction}: java.lang.NullPointerException
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
....

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Я попробовал предлагаемое решение и изменил режим на «ручной», а не на «нить», и сделал openSession () и closeSession () для каждого из моих 96 методов, которые обращаются к hibernate. Это не сработало. После пары вызовов методов доступа я получил ошибки «без сеанса». Так что это решение по какой-то причине не сработало, не говоря уже о том, что оно добавило много ненужных накладных расходов, поскольку только 3 из 96 методов действительно обновляли.

Итак, вместо того, чтобы обернуть все методы кодом открытия / закрытия сеанса, я обнаружил, что получаю правильный результат, просто заново открывая сеанс после commit ().

В приведенном выше коде у меня есть строка:

tx.commit();

Я обнаружил, что если после этого просто добавить openSession (), я получу результаты, которые искал. Таким образом, приведенный выше код был изменен с tx.commit () выше на:

tx.commit();
this.session - HibernateUtil.getSessionFactory().openSession();

Мне нужно только добавить это к 3 (на данный момент) методам, которые фактически выполняют обновления, а остальные 93 (на данный момент) методы могут оставаться такими, как написано, без необходимости

0 голосов
/ 02 марта 2012

Когда вы фиксируете транзакцию в сеансе, Hibernate автоматически закрывает сеанс, что означает, что его нельзя использовать повторно.

http://www.17od.com/2006/11/06/using-managed-sessions-in-hibernate-to-ease-unit-testing/


Вклмоя ссылка также объясняет, как управлять сессией вручную, поэтому протестируйте ее на функции, а затем измените все :)


Если вы новичок в hibernate, вам лучше попробовать начать свой проект сmaven archetype, который предоставит вам приличную структуру проекта с уже настроенным hibernate / spring для примера.

Установите maven, введите mvn archetype: generate, выберите технологии, которые вы хотите использовать.Затем введите mvn eclipse: eclipse, чтобы сгенерировать файлы конфигурации eclipse для вашего нового проекта и, наконец, импортировать его в eclipse.Это поможет вам начать, установив вам полный стек.(Ex archetype appfuse-basic-spring создаст приложение с SpringMVC, Spring и Hibernate)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...