簡體   English   中英

EntityManager.find 返回之前刪除的實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM