2016-07-07 3 views
0

を更新することはできません私は私のGrailsアプリケーションにクォーツジョブを次ていますクォーツ・ジョブは、レコード

class DataWarehouseJob { 

    def execute(context) { 

     LeadList list = context.mergedJobDataMap.get('list') 

     if (list.processing) { 
      return 
     } 

     list.processing = true 
     list.save(failOnError: true) 

     ... 

    } 
} 

list仕事triggerNowコールのパラメータとして渡され、それは正しい値が取り込まれます。このリストはすでにデータベースに存在します。それはリストを保存しようとしたときただし、次のエラーが発生します。

org.quartz.JobExecutionException: org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session : [haystack.LeadList#169]; nested exception is org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [haystack.LeadList#169] 
    at grails.plugins.quartz.GrailsJobFactory$GrailsJob.execute(GrailsJobFactory.java:111) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) 
Caused by: org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session : [haystack.LeadList#169]; nested exception is org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [haystack.LeadList#169] 

... 

Caused by: org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [haystack.LeadList#169] 
at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:618) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:301) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:244) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90 
... 

は私がLeadList withNewSession節約、@ExecuteInJTATransactionでクラスに注釈を付ける、前に保存リストにmergeを呼び出して、機能を保存するためのパラメータとしてflush: trueを追加しようとしたが、何もしています助けられました - 同じエラーが常に同じ行に現れます(list.save

これまでにこのコードが動作していて、どの変更がそれを壊す可能性があるのか​​分かりません - このクラスにかなりの時間。

コードは、Grailsの3.1.5で書かれており、私は解決策が誰かに利益をもたらすかもしれないので、質問を削除したくないのTomcat 8に

答えて

0

を実行しています。

問題は、ジョブがLeadListオブジェクトを受け入れていたため、オブジェクトを参照渡しではなくコピーしたことが原因で問題が発生したためです。私は、まだ

// LeadList list = context.mergedJobDataMap.get('list') 
long listId = context.mergedJobDataMap.get('listId') 
LeadList list = LeadList.findById(listId) 

を:

ソリューションではなく、オブジェクト全体の仕事へのパラメータとしてオブジェクトのIDを送信することで、ジョブの最初のデータベースに変更を加える前にIDによってオブジェクトをフェッチしますどのオブジェクトが以前にどのように動作していたのか、またある時点で突然問題が発生し始めたかどうかはわかりません。

関連する問題