gpt4 book ai didi

java - 删除的实体在相关实体的列表中,但我无法通过存储库找到它

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:56 25 4
gpt4 key购买 nike

我有以下代码:

@Transactional
public void delete(String id) {
PersonEntity personEntity = personRepository.findOne(id);
//has one address with ID = 10
personEntity.getAddresses().stream().forEach(address -> addressRepository.delete(address.getId()));
PersonEntity personEntity2 = personRepository.findOne(id);
// not empty - I can see that are existing one address with ID = 10
personEntity2.getAddresses();
// ID = 10, but here is null
addressRepository.findOne(10);
}

为什么我可以在相关实体列表中看到已删除的实体,但是当我将 findOne 与此 ID 一起使用时,方法返回 null

最佳答案

这就是 JPA 的工作原理:

在您的delete 中,您删除了一个人的所有地址。准确地说,您将地址从 JPA 托管上下文中删除。这就是为什么当您调用 addressRepository.findOne(10) 时(甚至在事务提交之前)您会得到 null 的原因,因为这些地址不存在于 JPA 上下文中等等。当您的事务最终提交时,地址将从数据库中删除(不是更早)。

由于您没有从个人地址列表中删除地址,它们仍会保留在那里(在事务提交之前和之后),即使引用的实体在数据库中不再有相应的记录。

要再次将数据库中的删除反射(reflect)给你的人,你可以调用 entitymanager.refresh(personEntity) 如果你在事务提交后已经有一个未关闭的实体管理器 session ,或者只调用再次 personEntity = personRepository.findOne(id)

@Vikram Singh 已经提出了一个更优雅的解决方案。为了使这项工作正常进行,您还需要使用 orhapn removal = true @OneToMany(orphanRemoval = true)

将人员之间的关系映射到地址

关于java - 删除的实体在相关实体的列表中,但我无法通过存储库找到它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42625641/

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