Я работаю с сеансом 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 (), он выдает ошибку, указанную выше.