2012-03-02 31 views
0

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

我有一个按钮来显示股票的所有保存stockprices表。我使用stock.getActualStockPrices()填充表格,但因为我从未将新股票价格添加到股票中,所以该表格仅显示程序开始时存在的股价。如果我取消注释stock.getActualStockPrices()。add(actualStockPrice); 我一旦将股票保存到数据库,导致股票的actualstockpriceList中发现新的stockprice,我就会收到重复的主键错误。那么该怎么办 :?

回答

0

如果股票已经存在于数据库中,它会发出异常。要仅将更改保存到现有实体,请使用merge进行更新。

此外,配置EntityManager刷新模式为FlushModeType.COMMIT,默认为AUTO。因此stock.getActualStockPrices().add(actualStockPrice)导致即时反映到数据库的变化。

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

+0

似乎现在就工作 - 谢谢:) – 2012-03-02 19:29:29

+0

@BieneMaja不客气 – 2012-03-03 05:31:42

+0

我现在遇到了这个问题。假设我的程序运行了很长时间并积累了大量stockPrices。如果我现在想要查看它们,并且我要求股票合并,则可能需要很长时间,具体取决于股票价格的数量(例如1000美元价格的几秒钟)。所以,我不合并的时间越长,合并它们所需的时间越长(有意义)。我可以对此做什么? – 2012-03-05 18:44:17