多线程JPA应用程序中的模型更改

时间:2012-03-02 04:36:32

标签: java multithreading jpa

我有一个带有gui的应用程序和一个保存在db中的股票列表。我在应用程序运行的整个过程中使用1个EntityManager来删除,更改和添加新股票。我有一个线程,定期抓住股票的实际股票过程并将其保存在数据库中。我在线程中使用另一个实体管理器(导致线程安全)。它看起来像这样:

 // 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); 一旦我将库存保存到数据库,我就会得到一个重复的主键错误,因为在库存的actualstockprice列表中找到了新的找到的股票价格。那怎么办:?

1 个答案:

答案 0 :(得分:0)

如果库存已存在于数据库中,则会产生异常。要仅将更改保存到现有实体,请使用merge进行更新。

此外,将EntityManager刷新模式配置为FlushModeType.COMMIT,默认为AUTO。因此stock.getActualStockPrices().add(actualStockPrice)会立即将更改反映到数据库中。

您可以手动管理事务,以更好地控制反映数据库中的更改:开始事务 - 数据库操作 - 提交/回滚事务