我有类似以下的代码,但未能通过最后一个断言:
@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
}
答案 0 :(得分:0)
EntityManager的工作方式是仅处理托管实体。
在第一种情况下,您将通过createQuery执行删除查询来删除TrivialEntity对象,没有TrivialEntity对象与entityManager相关联。
稍后会起作用的原因,您可以使用find检索与entityManager间接关联的琐碎实体对象,这次删除工作。
有关更多信息,remove
要从数据库中删除对象,必须先将其删除 检索(无论采用哪种方式),然后在活动事务中进行检索 可以使用remove方法删除。
如果参数不是,则通过remove抛出IllegalArgumentException 一个实体类的实例,或者它是一个分离的实体。