gpt4 book ai didi

java - 在删除操作之前清除 JPA 或 Hibernate EntityManager 或合并实体

转载 作者:行者123 更新时间:2023-12-02 10:32:34 24 4
gpt4 key购买 nike

我有一个处理多种类型实体的通用 JPA 存储库实现,如下所示:

@Component
@Transactional(transactionManager = "ubldbTransactionManager")
public class CatalogueRepositoryImpl {
...

@PersistenceContext(unitName = eu.nimble.utility.Configuration.UBL_PERSISTENCE_UNIT_NAME)
private EntityManager em;

public <T> void deleteEntity(T entity) {
if(!em.contains(entity)) {
entity = em.merge(entity);
}
em.remove(entity);
}

public <T> List<T> getEntities(String queryStr) {
Query query = em.createQuery(queryStr);
List<T> result = query.getResultList();
return result;
}
...
}

在某个时候我意识到某些实体尚未被删除。然后,我发现某些托管实体导致删除被取消,如:https://stackoverflow.com/a/16901857/502059中所述。

由于该方法是通用的,因此它内部包含了各种类型的实体。作为解决方法,我想摆脱导致取消删除的实体,并在开头添加了 em.flush()em.clear() deleteEntity 方法。虽然这有效,但我觉得这是一个肮脏的解决方法。

因此,我正在询问针对这种情况的一些最佳实践。例如,在 deleteEntity 中创建新的 EntityManager 是否是一种替代方案?我不希望这样,因为我希望 Spring 来管理 EntityManagerstransactions 的范围。

关于 Spring 管理的 EntityManager 的最后一点:我还想知道 Spring 管理的示例中的 em 是否是应用程序范围一?如果是这样,不是会保留所有检索到的实体并不断扩展吗?

最佳答案

如果您使用 Hibernate,则无需在删除实体之前进行合并。这只是 JPA 的要求,但 Hibernate 在这方面更为宽松。

您还可以执行以下操作:

entity = em.getReference(entity.getClass(), entity.getId());
em.remove(entity);

如果这不起作用,可能是因为您没有将 REMOVE 操作级联到子关联。

您可以使 T 参数扩展一个定义 getId 方法的 Identifying 接口(interface),并让您的实体实现此接口(interface),以便您的方法更通用。

关于java - 在删除操作之前清除 JPA 或 Hibernate EntityManager 或合并实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53528511/

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