2012-02-23 37 views
2

ここで間違っていることを教えてください。これは、コントローラクラスの私の方法は、私はAJAXを使用して上記のメソッドを呼び出すtomcat + lighttpd-jpaでフレームワークを再生

public static void save(Long jobId, Long posetByUserId) throws Exception 
{ 
    try{ 
     java.util.Date date = new java.util.Date(); 
     SavedJob job = SavedJob.findByUserIdJobId(connectedUserID(), jobId); //place 1 
     String validationText = null; 

     if(job != null){   //place 2 
      validationText = play.i18n.Messages.get("saved.already"); 
      renderJSON(validationText); 
     }else{ 

      SavedJob saveJob = new SavedJob(); 
      saveJob.userID = connectedUserID(); 
      saveJob.jobId = jobId; 
      saveJob.insertDate = date; 
      saveJob.updateDate = date; 
      saveJob.posetByUserId = posetByUserId; 
      saveJob.message = play.i18n.Messages.get("save.saved"); 

      UserProfile userProfile = connectedUser(); 
      userProfile.arlSavedJobs.add(saveJob); 
      UserProfile.saveUser(userProfile); 
        ..... 
      } 
....... 
} 

どのように見えるかです。

ケース1 開発モード(Tomcatではない)で再生を実行し、スレッドプールを1として指定すると、すべて正常に動作します。

ケース2 私はこれをtomcat + lighttpdにデプロイしました。上記の方法は失敗します。

私が上記の方法を2回呼び出すと、最初の要求が2番目の要求が2番目の要求に達したときに上の「場所1」にあるように見え、「saved.already」というエラーが表示されます。要求はシリアル化されません。

私はここで何か間違っていると確信していますが、アドバイスをお願いします。私は2つのアイテムを保存する両方の要求が必要です。

ありがとうございました。

私はまださらにデバッグしようとしています。私が誤解した場合の謝罪は、更新の代わりに挿入をしようとすると、休止状態になっている問題のようです。

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 

hibernate tries to fire an insert for an already saved entiry instead of an update 

したがって、以下のケース2の場合:2つのリクエストを送信します。 リクエスト1が保存され、userProfile.arlSavedJobs.add(saveJob)に1つのオブジェクトがあります。 リクエスト2は、1つのinsertと1つのupdateになるはずですが、hibernateが2つのinsertを起動しようとしているのを見ることができます。何か案は?

注意UserProfile.saveUser(userProfile); userprofileをマージします。マージ後、既に保存されているエンティティの更新の代わりに挿入が呼び出されます。


非常に高く評価されています。 調査後、私はここにいます:最初のリクエストが来たら、この場所のリストにオブジェクトを追加します:userProfile.arlSavedJobs.add(saveJob);保存は正常に機能します。 2番目のリクエストが今すぐに来ると、このリスト "arlSavedJobs"にはすでにオブジェクトがあり、2番目のリクエストはもう1つのオブジェクトを同じリストに追加します。 inleに到達すると "UserProfile.saveUser(userProfile);"それを保存しようとすると、新しいオブジェクトのための1つの挿入と、既存のオブジェクトの1つの更新(要求1によって追加された)を起動するはずです。ただし、両方のオブジェクトに対して2つの挿入が発生し、一意の制約例外が発生します。スタック追跡は、次のとおりです。

[2012-02-23 23:37:39,914] DEBUG 21530 [http-8080-3] - org.hibernate.jdbc.util.SQLStatementLogger.logStatement(SQLStatementLogger.java:111 ) - SAVED_JOB(DELETE_FLAG、INSERT_DATE、POSTED_BY_USER_ID、UPDATE_DATE、JOB_ID、USER_ID)の値を挿入する([2012-02-23 23:37:39,967] DEBUG 21583 [http- 8080-3] - org.hibernate.jdbc.util.SQLStatementLogger.logStatement(SQLStatementLogger.java:111) - SAVED_JOB(DELETE_FLAG、INSERT_DATE、POSTED_BY_USER_ID、UPDATE_DATE、JOB_ID、USER_ID)の値(?、?、?、?、 ?、)? [2012-02-23 23:37:40,019]エラー21635 [http-8080-3] - org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:234) - 重複するエントリ '4-1 'for key' PRIMARY ' [2012-02-23 23:37:40,075]エラー21691 [http-8 080-3] - org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348) - セッションとデータベース状態を同期させることができませんでした org.hibernate.exception。ConstraintViolationException:JDBCバッチ更新を実行できませんでした。 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate (ActionQueue.java:184) at 012.htm.ActionQueue.executeActions(ActionQueue.java:268) at 012.htm.ActionQueue.executeActions(ActionQueue.java:184)でを返します。 org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:345) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) at org.hibernate.impl.SessionImpl.flush( SessionImpl.java:1216) at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795) at play.db.jpa.JPABase._save(JPABase.java:47) at play.db.jpa.GenericModel.save(GenericModel。 Javaの:sun.reflectでsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) でcontrollers.JTLeadsController.saveLead(JTLeadsController.java:202) でmodels.UserProfile.saveUser(UserProfile.java:401) で184) play.mvcでjava.lang.reflect.Method.invoke(Method.java:597) でsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) .ActionInvoker.invokeWithContinuation(ActionInvoker .java:546) at play.mvc.ActionInvoker.invoke(ActionInvoker.java:500) at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:476) at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java :471) at play.mvc.ActionInvoker.invoke(ActionInvoker.java:159) at play.server.ServletWrapper $ ServletInvocation.execute(ServletWrapper.java:540) at play.Invoker $ Invocation.run(Invoker.java :265) at play.server.ServletWrapper $ ServletInvocation.run(ServletWrapper.java:531) at play.Invoker.invokeInThread(Invoker.java:67) at play.server.ServletWrapper.service(ServletWrapper.java:130) ) (javax.servlet.http.HttpServlet.service(HttpServlet.java:717))at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core。 StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) org.apache.catalina.connectorでorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) でorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) で。 CoyoteAdapter.service(CoyoteAdapter.java:293) at org.ap (Http11Processor.java:859) (org.apache.coyote.http11.Http11Protocol)$ Http11ConnectionHandler.process(Http11Protocol.java:602) at org.apache.tomcat.util.net。 JUoEndpoint $ Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:662) 原因:java.sql.BatchUpdateException:キー 'PRIMARY'の重複したエントリ '4-1' com.mchange.v2.c3p0.impl.NewProxyPreparedStatementでcom.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1449) でcom.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2018) で。 executeBatch(NewProxyPreparedStatement.java:1723) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher。Javaの:70)org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) で ... 37もっと javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException:JDBCバッチ更新 を実行できませんでしたorg.hibernate.ejb.AbstractEntityManagerImpl.convertでorg.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) でorg.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) (AbstractEntityManagerImpl.javaで:1153) at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:798) at play.db.jpa.JPABase._save(JPABase.java:47) at play.db.jpa.GenericModel.save (GenericModel.java:184)0 sun.reflect.NativeMethodAccessorImpl.invokeでsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) でcontrollers.JTLeadsController.saveLead(JTLeadsController.java:202) でmodels.UserProfile.saveUser(UserProfile.java:401) でplay.mvc.ActionInvoker.invokeWithContinuationでjava.lang.reflect.Method.invoke(Method.java:597)でsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で(NativeMethodAccessorImpl.java:39) play.mvc.ActionInvoker.invoke(ActionInvoker.java:500)で(ActionInvoker.java:546)

+1

それはあなたが同じパラメータで二回セーブヒットした場合、「場所2」を達するために、完全に正常な見えます...問題が何であるか本当に不明です!そして、あなたは ''すでに保存されました ''というエラーを出しますか?コードが翻訳文字列を取得しようとしています...エラーは何ですか? – Stefano

+0

ステファノありがとうございます。 org.hibernate.exception.ConstraintViolationException:JDBCバッチ更新を実行できませんでした。org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)で を実行できませんでした。 at org.hibernate.exception.JDBCExceptionHelper.convert (JDBCExceptionHelper.java:66) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)hibernateは、更新の代わりに既に保存されているエンティティの挿入を開始しようとします。 –

+1

それは助けますが、十分ではありません。エラーメッセージでは、コードからエラーを起こす正確な行番号を取得する必要があります。エラーメッセージの残りの部分を投稿して、コードに対応する行番号をマークできますか? – Stefano

答えて

1

あなたは可能性のあるエラーの3ヶ所を持っている:

  • 場所1:このメソッド呼び出し(SavedJobジョブ= SavedJob.findByUserIdJobId(connectedUserID()、jobId); // place 1)は既にSavedJobが利用可能であるのにnullを返します。クエリを作成しているコードをチェックする必要があります。
  • 場所2:クライアント側では、ajaxイベントを2回実行します(たとえば、ボタンに複数のonclickハンドラを追加する、または最初のクリック後にボタンを無効にしてダブルクリックを2回実行するなど) ...つまり、メソッドが2回実行されることを意味します。ただし、通常の状況では、ジョブを見つけて検証メッセージを返す必要があります。ただし、
  • 場所3:トランザクションをサポートしていないデータベースを使用しています。通常のデータベース(mysql、postgresql、oracle、db2など)は内部的に挿入をシリアライズし、コードは完全に機能します。
+0

ありがとうございました。私はポイント1と2が問題ではないことを確認することができます。ポイント1のメソッド呼び出しはオブジェクトを戻します。ポイント2は通話にも問題ありません。私は、保存の直前に2つのリクエストのオブジェクトのキーをプリントアウトしようとしましたが、キーは異なっていました(ユニーク)。私はmysqlを使用しています。一つのことは、私がリクエスト1と2を4〜5秒の間隔で送ってもうまくいくということです。私が2つのリクエストをほぼ即時に送信すると、何らかの形で休止することができます;古いオブジェクトが既に保存されていることを知り、更新の代わりに挿入を行います。 "UserProfile.saveUser(userProfile);"私はマージを行う。 –

+0

hmm ... userprofileだけでなく、ジョブを保存するようにしてください。セーブ/マージなどのカスケード設定を確認してください。ここに問題があるようです。 –

+0

ジョブのみの保存。救済の親は働いていたはずですが、今はなぜか分かります手伝ってくれてありがとう。 –

関連する問題