2017-03-08 706 views
2

我正在使用其中一個測試服務器,並且在嘗試調用方法時從hibernate中獲取錯誤,其中通過用戶名獲取Person對象。我究竟做錯了什麼?Hibernate,PostgreSQL:無法提取結果集,SQLState 25P02

錯誤日誌:

WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: 25P02 
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: current transaction is aborted, commands ignored until end of transaction block 
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: 25P02 
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: current transaction is aborted, commands ignored until end of transaction block 
org.hibernate.exception.GenericJDBCException: could not extract ResultSet 
     at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
     at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91) 
     at org.hibernate.loader.Loader.getResultSet(Loader.java:2066) 
     at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863) 
     at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:910) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) 
     at org.hibernate.loader.Loader.doList(Loader.java:2554) 
     at org.hibernate.loader.Loader.doList(Loader.java:2540) 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) 
     at org.hibernate.loader.Loader.list(Loader.java:2365) 
     at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497) 
     at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) 
     at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236) 
     at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300) 
     at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) 
     at org.hibernate.internal.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:966) 
     at com.myproject.spring.dao.PersonDAOImpl.findPersonByUsername(PersonDAOImpl.java:118) 
Caused by: org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block 
     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198) 
     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927) 
     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:304) 
     at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
     at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
     at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82) 

PersonDAOImpl:

@Override 
    @Transactional 
    public Person findPersonByUsername(String username) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     Query query = session.createQuery("from Person as p where p.username=:username"); 
     query.setParameter("username", username); 
     try { 
      return (Person) query.uniqueResult(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

數據庫是存在的,我究竟做錯了什麼?謝謝。

更新此錯誤始終遵循上述一個:

WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: 25006 
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: cannot execute nextval() in a read-only transaction 
org.hibernate.exception.GenericJDBCException: could not extract ResultSet 
     at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
     at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91) 
     at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:122) 
     at org.hibernate.id.SequenceHiLoGenerator$1.getNextValue(SequenceHiLoGenerator.java:81) 
     at org.hibernate.id.enhanced.LegacyHiLoAlgorithmOptimizer.generate(LegacyHiLoAlgorithmOptimizer.java:77) 
     at org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:78) 
     at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:118) 
     at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) 
     at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
     at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) 
     at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
     at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
     at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) 
     at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) 
     at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) 
+0

嘗試增加@Transactional(傳播=「REQUIRES_NEW」),並檢查,因爲它可能會因爲任何其他交易,尚未回滾 – rathna

+0

@rathna來失敗:沒有幫助,同樣的錯誤。 –

+0

'catch(Exception e){e.printStackTrace();返回null; ''是一個很糟糕的做法。你的方法看起來很好,但是之前的**異常導致當前事務失敗。但失敗的事務需要回滾(至少保存到一個「乾淨」的保存點)。 - 絕對不要處理這樣的例外情況,尤其是涉及交易時。至少你可以做的是重新拋出一個'RuntimeException's,就像'catch(Exception e){throw new RuntimeException(e); }' – pozs

回答

1

您的實際問題很簡單:你在一個只讀事務稱爲save()操作。

但是,因爲你放下你的例外:

} catch (Exception e) { 
    e.printStackTrace(); 
    return null; 
} 

你不能輕易調試。中止的異常需要回滾(至少保存到創建時未中止的保存點)。

當一個事務處於這個「中止」狀態時,任何後續查詢都會拋出這個當前事務被中止,直到事務結束時忽略命令異常。

你應該(至少)重新拋出異常,以避免類似案例,在未來:

} catch (Exception cause) { 
    // print or log the error here, before re-throwing 
    throw new RuntimeException(cause); 
} 

有了這個,你會在第一地點得到正確的錯誤。