gpt4 book ai didi

java - 保存父实体并从集合中删除子实体时处理 EntityNotFoundException

转载 作者:行者123 更新时间:2023-12-01 08:45:51 24 4
gpt4 key购买 nike

我的问题很简单,但找到解决方案却成为一项相当乏味且困难的任务。

我有两个 hibernate 实体,

  1. 所有者

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

  1. 姓名
  2. 地址
  3. dogs(Dog 实体的集合 - OneToMany 关系)。

Owner 的集合中删除 Dog 时(无论是从对象的集合还是通过 Dog 存储库从数据库中),以及更新Owner,然后尝试将更新后的对象保存在数据库中,抛出以下异常:

javax.persistence.EntityNotFoundException:无法找到 ID 为 10 的 project.pets.entities.Dog

解决该问题的一种方法是在 Dog 集合更新后,通过调用 Owner 的 Repository 获取新版本的 Owner code> 与 findOne(ownerId),然后更新所有者的地址并将实体保存到数据库中。

但这似乎不是一个合适的解决方案。

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

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

编辑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);

最佳答案

您不需要执行dogRepository.delete(firstDog);:所有者已经负责传播从数据库中删除您的条目。这就是为什么你有异常的原因: firstDog 已经被 Hibernate 删除,所以当你再次调用 dogRepository.delete(firstDog); 时,Hibernate 会提示,因为它找不到您的实体。

关于java - 保存父实体并从集合中删除子实体时处理 EntityNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43368103/

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