2012-03-02 12 views
0

私はguiとdbに保存されている在庫のリストを持つアプリケーションを持っています。私は1 EntityManagerを使用して、アプリケーションが実行されている間、新しい株を削除、変更、追加します。私は定期的に株式の実際の株式コースをつかみ、それらをdbに保存するスレッドを持っています。スレッドで別のエンティティマネージャを使用します(スレッドの安全性の原因)。マルチスレッドJPAアプリケーションのモデルの変更

// grabbing the actual info and making actualStockPrice with it 
.... 
// adding the correct stock to the new stockprice 
actualStockPrice.setStock(stock); 
// Can't do the next line cause of duplicate primary key 
     //stock.getActualStockPrices().add(actualStockPrice); 
// Saving new price in db 
stockPriceModel.saveActualStockPrice(actualStockPrice); 

保存されている在庫のすべてのストックを表示するボタンがあります。私はstock.getActualStockPrices()でテーブルを塗りつぶしますが、在庫に新しい在庫を追加したことがないため、テーブルはプログラムの開始時に在庫が表示されます。 stock.getActualStockPrices()のコメントを外した場合、add(actualStockPrice); ストックの実際のストックプライスリストに新しく発見された株価が原因で、株をdbに保存するとすぐに重複した主キーエラーが発生します。じゃあ何をすればいいの :?

答えて

0

ストックが既にデータベースに存在する場合、例外が発生します。既存のエンティティに変更を保存するには、mergeを使用して変更を更新します。

さらに、デフォルトでAUTOであるため、EntityManagerのフラッシュモードをFlushModeType.COMMITに設定します。したがって、stock.getActualStockPrices().add(actualStockPrice)は、変更をデータベースに即座に反映させます。

データベースの変更を反映するために、トランザクションを手動で管理することができます。トランザクションの開始 - データベース操作 - コミット/ロールバックトランザクション

+0

ありがとうございました:) –

+0

@BieneMajaよろしくお願いします。 –

+0

これで問題が発生しました。私のプログラムは長い間実行されており、多くの株式を蓄積しているとしましょう。今私はそれらを表示したいと私は在庫をマージすると株価の数(例えば、〜1000価格のための数秒)に応じて非常に長い時間がかかる場合があります。だから、長い私は合併するのにかかる時間が長くなる(意味をなさない)。これに対して私は何ができますか? –

関連する問題