![](/img/trans.png)
[英]JPA Inheritance entitymanager.find produces ClassCastException
[英]EntityManager.find returns previously deleted entity
我有如下代碼,它使最后一個斷言失敗:
@Transactional
void foo()
{
Assert.assertNotNull(em.find(TrivialEntity.class, 1));
Assert.assertEquals(em.createQuery("DELETE TrivialEntity WHERE id=1").executeUpdate(), 1);
Assert.assertNull(em.find(TrivialEntity.class, 1)); // fails
}
但是,在運行此代碼並檢查數據庫后,我看到實體已被刪除。 我猜第二個“查找”語句只是從第一個“查找”返回先前返回的結果。
在上面的第一條和第二條語句之后,我還嘗試了上面的代碼與“em.flush”,結果沒有改變。 如下代碼確實有效,但我不想使用“刪除”:
@Transactional
void foo()
{
Assert.assertNotNull(em.find(TrivialEntity.class, 1));
em.remove(em.find(TrivialEntity.class, 1));
Assert.assertNull(em.find(TrivialEntity.class, 1)); // now it passes
}
EntityManager 的工作方式是它只處理托管實體。
在您通過 createQuery 執行刪除查詢來刪除 TrivialEntity object 的第一種情況下,沒有 TrivialEntity object 與 entityManager 關聯。
它后來工作的原因,您使用 find 檢索與 entityManager 間接關聯的瑣碎實體 Object,這次刪除工作。
欲了解更多信息刪除
為了從數據庫中刪除 object,必須首先檢索它(無論哪種方式),然后在活動事務中,可以使用 remove 方法將其刪除。
如果參數不是實體 class 的實例或者它是分離的實體,則 remove 將引發 IllegalArgumentException。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.