2017-03-08 35 views
2

私のテストサーバーの1つに取り組んでいて、メソッドを呼び出そうとしているときにヒューバーネームからエラーが発生しました。私は間違って何をしていますか?Hibernate、PostgreSQL:resultsetを抽出できませんでした。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; 
     } 
    } 

データベースがあり、私が間違っているのでしょうか?ありがとうございました。

更新このエラーは、常に上記の1以下の

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(propagation = "REQUIRES_NEW")を追加し、ロールバックされていない他のトランザクションのために失敗している可能性があることを確認してください。 – rathna

+0

@rathna:DIdは助けにならない、同じエラーです。 –

+0

'catch(例外e){e.printStackTrace(); nullを返す。 } 'は本当に悪い習慣です。あなたのメソッドはうまく見えますが、**以前の例外**が原因で現在のトランザクションが失敗しました。しかし、失敗したトランザクションはロールバックする必要があります(少なくともセーブポイントは「クリーン」でした)。 - 特にトランザクションが関係している場合は、このような例外を処理しないでください。あなたができることは、 'catch(Exception e){Run newException(e);}のように' RuntimeException'を再スローすることです。 } ' – 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); 
} 

を、あなたは最初の場所で、正しいエラーが発生します。

関連する問題