当前位置: 首页 > 知识库问答 >
问题:

从集合中保存带有已删除子实体的父实体时处理EntityNotFoundException

卢雅惠
2023-03-14

我的问题很简单,但找到解决办法却成了一项相当乏味和困难的任务。

我有两个冬眠实体,

  1. 所有者

所有者(或“父”实体)有三个字段,

  1. 名称
  2. 地址
  3. dogs(dog实体的集合-onetomany关系)。

当从所有者集合中删除Dog时(从对象的集合中删除和通过Dog存储库从数据库中删除),以及更新所有者的地址,然后尝试将更新后的对象保存到数据库中,将引发以下异常:

javax.persistence.EntityNotFoundException:找不到id为10的project.pets.entities.dog

解决这个问题的一种方法是,在更新dog集合后,通过使用findone(ownerId)调用所有者的存储库,获取owner的新版本,然后更新所有者的地址并将实体保存到数据库中。

但这似乎不是一个恰当的解决方案。

我应该提到没有实现缓存。

有人遇到这样的事情并设法妥善处理吗?

编辑1:

@Entity
@Table(name = "owners")
public class Owner {

...

@Column(name = "address")
private String address;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "owner", 
           cascade = {CascadeType.MERGE, CascadeType.REMOVE})
private List<Dog> dogs;

...
@Entity
@Table(name = "dogs")
public class Dog {

 ...

@ManyToOne
@JoinColumn(name = "owner_id")
private Owner owner;

...
Owner owner = ownerRepository.findOne(ownerId);
Dog firstDog = owner.getDogs().get(0); // getting the first dog of the owner

owner.getDogs().remove(0); // removing from object's collection
dogRepository.delete(firstDog); // removing from DB

owner.setAddress("new address");
ownerRepository.save(owner);

共有1个答案

方安怡
2023-03-14

您不需要执行dogrepository.delete(firstDog);:所有者已经负责将条目从数据库中删除的过程进行传播。这就是出现异常的原因:firstDog已经被Hibernate删除,所以当再次调用dogrepository.delete(firstDog);时,Hibernate会抱怨,因为它找不到您的实体。

 类似资料:
  • 删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。 当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么? 这是我的

  • 我的实体。ValidationStep与documentDetail有一对一的关系,documentDetail与documentValidations有一个完全的关系 我的删除查询 父ValidationStep被删除,但是docDetail和documentValidations仍然在数据库中。

  • 我正在从经典Spring 4.3.2 Hibernate(HQL)迁移到Spring Boot 1.4.1 Hibernate(JPA)HikariCP连接池,并且在批量插入方面遇到问题。我需要保存1000到527 000个元素的大列表。 当我只保存一个实体的批次,没有任何依赖项(例如:类的5000个元素)时,一切都很好。 但是,如果我尝试同时保存子实体和父实体(只需为其设置),我会得到例外: 但

  • 在我的项目中,我有两个实体与@OneTomany和@ManyToOne相关。看看这些照片- 我的问题-当我从供应品中删除记录时,也会从产品中删除记录,但我不会这样做。如果我删除CascadeType.All,然后重试此操作,将出现错误 com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:无法删除或更新

  • 我正在尝试开发一个小型电子商务项目。我有一个篮子和篮子项目实体。我只是想当我为客户保存购物篮时,我想把购物篮项目保存在数据库中。我认为我不应该为篮子项目创建存储库。我应该能够保存篮子项目,同时使用篮子存储库保存篮子。 在这里,我试图通过篮子服务获得一个篮子项目,并将其设置为篮子实体并保存它。 我有什么问题?我有个例外。

  • 我是Spring BootJPA的新手,正在努力找出多个实体之间的关系。 我有一个用户实体、一个产品实体和一个评论实体。一个用户有很多评论。一个产品有很多评论。评论有一个产品和一个用户。 目前,我正在为用户使用一对多的关系 我的问题: 如何在不删除产品实体和用户实体的情况下删除审阅实体? 我应该使用哪种级联类型? 用户实体: 产品实体: 审查实体: 用户控制器: 用户服务: 简单运行: 我认为我不