2017-07-19 4 views
-1

postgresqlでhibernateを使用していますが、トランザクションエラーが発生しています。 SNAME現在のトランザクションが中止され、休止状態のpostgresqlのトランザクションブロックが終了するまでコマンドが無視される

すべてのヘルプは高く評価され|

SNO(PK):

public class AppControl { 

public static void main(String[] args) { 
    //Configuration 
    Configuration configuration = new Configuration(); 
    configuration.configure("hibernate.cfg.xml"); 
    Session session = null; 
    Transaction transaction = null; 

    //Session Factory 
    SessionFactory sessionFactory = configuration.buildSessionFactory(); 

    try { 
     //Session 
     session = sessionFactory.openSession(); 
     //Begin transaction 
     transaction = session.beginTransaction(); 
     //DB operations 

     Student student = new Student(); 
     student.setSno(2); 
     student.setSname("Venky"); 
     session.save(student); 
     session.flush(); 
     transaction.commit(); 
    }catch (RuntimeException e) { 
     try { 
      session.flush(); 
      transaction.rollback(); 
     }catch(Exception ex) { 
      System.out.println("Cannot rollback transaction"); 
     } 
    } finally { 

     session.close(); 
     sessionFactory.close(); 
    } 

} 
} 

私はこれは私の学生のテーブルで、次のエラーに

Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute statement 
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.executeUpdate(ResultSetReturnImpl.java:190) 
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581) 
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:103) 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:461) 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:347) 
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) 
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) 
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222) 
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425) 
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) 
at com.demo.app.AppControl.main(AppControl.java:32) 
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:2102) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187) 
    ... 13 more 

が発生します。これが私のメインアプリです。ありがとうございました

+0

この例を見てきました(例:https://www.mkyong.com/hibernate/hibernate-transaction-handle-example/) –

+0

私はこのスタックトレースにもっとあると思いますか? –

+1

これは、生徒に 'zip'と' course_no'を設定しないことによって引き起こされる可能性がありますか? – tima

答えて

0

前のクエリが失敗しました。おそらく例外がどこかにありますので、出力されません。または、ログに戻って最初にエラーを確認する必要があります。

0

スキーマはPK制限を定義します。 student.setSno(2)は主キーであるため、複製することはできません。これが最初の試合をパスした理由です。 2を別の値に変更するか、PostgreSQLテーブルからレコードを削除して、コードを再度実行してみてください。

キャッチブロックにSystem.out.printStackTrace(e)を追加すると、問題の原因がわかります(同じ主キーで新しいレコードを挿入するなど)。

Caused by: org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block例外は、現在実行中のトランザクションに何らかの障害があり、トランザクション内で実行されたコマンドが何の効果もないことを示しています。接続時にrollbackにトランザクションを呼び出す必要があります。

+0

私はすべての実行で主キーを変更しました。私は接続上のトランザクションをロールバックしようとしたが、それもどちらかの助けになりませんでした。 – Venky

+0

何か起こった情報があれば、catchブロックでキャッチされたRuntimeExceptionを出力しようとしましたか? – chalda

関連する問題