刪除之後這是序列靜止投擲IntegrityConstraintViolation:的EclipseLink 2.5持久實體時,記錄從數據庫
- App1的:與ID = 1數據庫堅持實體。沒問題。
- App2:外部應用程序刪除ID = 1的相同記錄。沒問題。
- App1:試圖再次堅持先前被App2刪除的實體,這裏會拋出一個異常說「IntegrityConstraintViolation」,好像記錄仍然在數據庫中,而我插入它兩次,而不是。
問題是,正如我所看到的,EntityManager正在使用緩存來驗證數據庫的完整性。不知何故,即使我打電話
getEM().getEntityManagerFactory().getCache().evictAll(); or getEM().clear();
EntityManager的是保持這個紀錄在高速緩存中不知何故,和我跑出來的有關如何清除高速緩存的想法。一個解決辦法,我發現是從應用1致電:
getEM().remove(entity.class, id);
,並有效地從數據庫和EntityManager的緩存過的記錄。但是,這不是重點,它只能證明它使用緩存進行驗證,但主要問題仍然存在,「我從另一個應用程序中刪除後無法再保留該記錄」。
順便說一句,我也嘗試刷新實體,並沒有工作。它會拋出一個異常,說實體沒有管理。
有人有任何想法如何解決這個問題?
步驟1和3是否使用EntityManager的相同實例執行,或者是否爲每個操作創建新實例? –
你使用持久還是合併?如果它使用樂觀鎖定,請嘗試清除版本字段 – Chris
Hi @DavidLevesque,是的,它對操作,插入和刪除都使用相同的EntityManager。事實上,爲了包含更多信息,發生這種情況的場景是爲幾種方法運行測試用例。我稱之爲App1的是'methodA',App2是Test Class的'tearDown'方法。這種交互發生在幾個方法和'tearDown'方法之間,在這個方法中,所有的測試用例都在數據庫上創建記錄用於測試目的,'tearDown'方法**清理**數據庫,以便下一個測試用例可以在清理時開始執行數據庫。 –