也許我只是給你一小段代碼而過度簡化了這一點(如果是這種情況,我會發布更多的代碼),但我認爲,最初,更少更好:EntityManager嘗試插入實體而不被提示
我有一個資產類型的實體,它有一個位置類型的字段,它也是一個實體。當我設置資產的位置時,我還必須設置其子項的位置。
Location location = asset.getLocation();
em.merge(location);
em.flush();
childAsset.setLocation(asset.getLocation());
em.flush();
當我運行的flush(),我得到以下異常:
內部異常:java.sql.SQLIntegrityConstraintViolationException:ORA-00001:唯一約束(SWRADMIN.LOCATION_PK)違反
我的問題是...爲什麼這個位置對象甚至試圖被持續?我所做的只是在一個實體中設置一個變量。
這工作很好,但我們只是切換到使用Eclipselink和Java EE 6,這個問題彈出。
解決方案?:我用「分離」的想法從下面並提出了以下變化:
Location location = asset.getLocation();
em.detach(childAsset);
childAsset.setLocation(asset.getLocation());
em.merge();
em.flush();
和它的工作!我很困惑,爲什麼,但是......你會認爲自動同步會做同樣的事情。
所以,我做了一個em.detach(childAsset),然後childAsset.setLocation(位置),然後em.merge(childAsset),它的工作!我的問題是...爲什麼?這不是同步開始時應該做的嗎? – wsaxton
看着你原來的代碼,em.merge(location)然後em.flush()會在數據庫中持久化'location',然後在childAsset中設置它,然後再刷新'SQLIntegrityConstraintViolationException',因爲'location'已經存在於數據庫中。修改答案,參考編輯部分。 –