Получение SQLException: операция не разрешена после закрытия ResultSet - PullRequest
0 голосов
/ 17 июня 2020

Я работаю с сеансом Hibernate, и я в основном пытаюсь обновить таблицу, но в то же время перед обновлением мне нужно убедиться, что этой вставки еще нет в таблице. Примечание: это в основном задание cron, которое будет выполняться ежедневно, и мне просто нужно вставить новую запись на основе некоторого logi c.

Вот фрагмент моего кода:

    ... 
    ....

    ScrollableResults scroll = 
                crit.addOrder(Order.asc("expireDate"))
                .scroll();   // this will give list on daily basis which I need to filter out
            session.beginTransaction();
            Query query = session.createQuery("from SD"); 

            List<SD> sdObjectList= query.list(); // This is to do select statement so I can compare the list with new entry in while loop below
            List<String> sdList= new ArrayList<String>();  // to hold only strings extracted frm sdObjectList

            for(SD sd: sdObjectList) {
                sdList.add(sd.getName());
            }
            session.beginTransaction();
            while(scroll.next()) {        // --> This line throws error 
                Foo foo_obj = (Foo) scroll.get(0);
                // foo_obj will have unique id as well as name
                if (sdList.contains(foo_obj.getName())) {
                    out.println("**SKIPPING foo_obj, since already in DB " + foo_obj.getName());
                    continue;
                }
                SD sd= new SD(); 
                SD.setdID(foo_obj.getId());
                SD.setName(foo_obj.getName());
                SD.setStatus("xyz");
                session.save(SD);

                FooObjList.add(foo_obj);
            }   
            //Commit the transaction
            session.getTransaction().commit();
            scroll.close();

Вот ошибка:

   [java] Jun 16, 2020 10:52:32 PM org.hibernate.util.JDBCExceptionReporter logExceptions
     [java] WARNING: SQL Error: 0, SQLState: S1000
     [java] Jun 16, 2020 10:52:32 PM org.hibernate.util.JDBCExceptionReporter logExceptions
     [java] SEVERE: Operation not allowed after ResultSet closed
     [java] org.hibernate.exception.GenericJDBCException: could not advance using next()
     [java]     at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
     [java]     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
     [java]     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
     [java]     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
     [java]     at org.hibernate.impl.ScrollableResultsImpl.next(ScrollableResultsImpl.java:127)
     [java]     at com.netnation.jobs.snapnames.list.GenerateList.main(GenerateList.java:199)
     [java] Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed
     [java]     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
     [java]     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
     [java]     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
     [java]     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
     [java]     at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:794)
     [java]     at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7139)
     [java]     at com.mchange.v2.c3p0.impl.NewProxyResultSet.next(NewProxyResultSet.java:2859)
     [java]     at org.hibernate.impl.ScrollableResultsImpl.next(ScrollableResultsImpl.java:122)
     [java]     ... 1 more

Кто-нибудь может подсказать, как исправить? Или какой-либо другой лучший способ справиться со всей логией c?

Примечание: Я только что понял, что два метода session.beginTransaction () не вызывают никаких ошибок, но я не уверен, что это хорошая практика, и я закрываю его должным образом? Также предоставляет ли сеанс гибернации какой-либо другой лучший способ достичь вышеуказанного сценария?

Но когда я удаляю первый session.beginTransaction (), он выдает ошибку, указанную выше.

1 Ответ

0 голосов
/ 17 июня 2020

Вам не нужно проверять, существует ли сущность. Это не требуется:

if (sdList.contains(foo_obj.getName())) {
    out.println("**SKIPPING foo_obj, since already in DB " + foo_obj.getName());
    continue;
}

Поскольку вы сами устанавливаете первичный ключ с помощью этого:

SD.setdID(foo_obj.getId());

, и вы не используете какой-либо инструмент автоматически сгенерированный идентификатор , когда вы выполните save, Hibernate сначала проверит, существует ли сущность, через SELECT. Если да, он выполняет UPDATE, если нет, он выполняет INSERT.

Теперь, до тех пор, пока в вашем WHILE l oop не выполняется первое l oop? Обратите внимание: если возникнет исключение, вы больше не сможете повторно использовать этот сеанс, возможно, это объясняет, почему ResultSet был закрыт.

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