gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:16:46 24 4
gpt4 key购买 nike

我有如下代码,但最后一个断言失败:

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

但是,运行此代码并检查数据库后,我看到该实体已被删除。我猜测第二个“find”语句只是返回先前从第一个“find”返回的结果。

我还在上面的第一条和第二条语句之后使用“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 对象,没有TrivialEntity 对象与entityManager 关联。

后面起作用的原因是,你使用find来检索Trivial Entity Object,间接关联到entityManager,这次remove起作用了。

了解更多信息remove

In order to delete an object from the db it has to first be retrieved (no matter which way) and then in an active transaction, it can be deleted using the remove method.

An IllegalArgumentException is thrown by remove if the argument is not a an instance of an entity class or if it is a detached entity.

关于java - EntityManager.find 返回先前删除的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58860058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com