3

ので...私が同一であるそのうちの2つは、現在実行中の3つのジョブを、考えてみましょう:ジョブはEntityManagersを共有しますか - 再生しますか?フレームワーク

CrawlJob job1 = new CrawlJob(); 
CrawlJob job2 = new CrawlJob(); 
CurrentJob job3 = new CurrentJob(); 
job1.now() 
job2.now() 
job3.now() 

私はJOB1で次の手順を実行した場合:

JPA.em().flush(); 
JPA.em().clear(); 

ウィルもすべて取り外しjob2とjob3が現在処理しているエンティティつまり、データベースで検索したjob2/job3のモデルオブジェクト/モデルオブジェクトを渡すと、オブジェクトがセッションから切り離されたためにjob2/job3が壊れやすいのですか?

同様に、私はJOB1の次ないと言うことができます:

long id = 123 
User user1 = new User(id); 
user1.save(); 

そしてJOB2またはJOB3に私が行います

User user2 = User.findById(id); 

は「 "ヌル" に等しいか等しくなるUSER2ますuser1 "?つまり、user1がまだデータベースにフラッシュされていない場合でも、job2またはjob3はIdでそれを探すことができますか?

これらの質問は、Jobs(同じJobまたは異なるJobのインスタンス化であるかどうかにかかわらず)がEntityManagersを共有するかどうか、つまり.em().flush()、.em() clear()または.em()。getTransaction()。commit()またはModel.save()はすべてのジョブに同時に影響しますか?

答えて

3

ジョブは独自のjpaトランザクションを開始し、エンティティはトランザクションが完了するまで実際には永続化されません。

したがって、job2はエンティティをロードするときにジョブ1が完了しない限り、job1によって加えられた変更を表示しません。あなたはまだあなたがJOB1でトランザクションをコミットし、のようなものと新しいものを開始することができます実行しているjobs1ながらデータをコミットしたい場合は

JPA.em().getTransaction().commit(); 
    JPA.em().getTransaction().begin(); 
    JPA.em().flush(); 
    JPA.em().clear(); 
+0

は言うことができますJOB1とJOB2(同じジョブの2つのインスタンス)processQueue()と呼ばれる 'doJob()'と同じメソッドを呼び出します。したがって、 'processQueue(){}'内にある場合、job1またはjob2がprocessQueueを呼び出すかどうかによって異なるトランザクションが返されるというJPA.em()。getTransactionを実行しますか?同様に、job1の 'JPA.em()。clear'を実行しているということは、現在job2にアタッチされているエンティティには影響しません。 – HelpMeStackOverflowMyOnlyHope

+0

JPA.em()。getTransaction()。commit()の後にJPA.em()を実行する理由は何ですか? commit()は、すでにデータベースに書き出すことができるすべてのものをフラッシュ/シンクしませんか? – HelpMeStackOverflowMyOnlyHope

+0

答えをありがとう、私はimmediaetly保存する必要があるエンティティの多くがあります。だから、私はこのコードをvoid名の "saveEntities"に入れて、imeediate updateが必要な場所から呼び出します。 – dreampowder