EntityManager.find返回先前删除的实体

时间:2019-11-14 15:14:09

标签: java sql-server hibernate

我有类似以下的代码,但未能通过最后一个断言:

@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
}

1 个答案:

答案 0 :(得分:0)

EntityManager的工作方式是仅处理托管实体。

在第一种情况下,您将通过createQuery执行删除查询来删除TrivialEntity对象,没有TrivialEntity对象与entityManager相关联。

稍后会起作用的原因,您可以使用find检索与entityManager间接关联的琐碎实体对象,这次删除工作。

有关更多信息,remove

  

要从数据库中删除对象,必须先将其删除   检索(无论采用哪种方式),然后在活动事务中进行检索   可以使用remove方法删除。

     

如果参数不是,则通过remove抛出IllegalArgumentException   一个实体类的实例,或者它是一个分离的实体。