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

标签 java java-8 spring-data spring-data-jpa

我有以下代码:

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

相关文章:

java - 如何使用 org.apache.commons.configuration2 读取属性文件?

java - 如何修复 android 中的布局

java - Play Framework 中 AJAX 调用的部分渲染

java - 如何在 forEach 中执行操作并将其传递给 Java 流中的 groupingBy

java - 创建的 Runnables 的 lambda 的不同行为

java - 从 Optional 流式传输列表

java - 使用 JPA CRUD 存储库查找子实体的数量

java - 创建动态排序比较器

java - 配置 Spring Data Repository 类以针对读取/选择方法命中 read_replica_db 并针对写入/插入方法命中 main_db ?

java - Spring Redis 问题 : GetAllCacheNames from redis cache is not working with RedisCacheManager