我有一个带有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列表中找到了新的找到的股票价格。那怎么办:?
答案 0 :(得分:0)
如果库存已存在于数据库中,则会产生异常。要仅将更改保存到现有实体,请使用merge
进行更新。
此外,将EntityManager刷新模式配置为FlushModeType.COMMIT
,默认为AUTO
。因此stock.getActualStockPrices().add(actualStockPrice)
会立即将更改反映到数据库中。
您可以手动管理事务,以更好地控制反映数据库中的更改:开始事务 - 数据库操作 - 提交/回滚事务。