保留实体时设置OneToMany关系的ID

时间:2019-01-09 10:46:54

标签: java hibernate jpa persistence

我有一个休眠的应用程序,我想在其中保留一个所有者。

一个主人可以养很多动物

(在所有者内部)

   @OneToMany(mappedBy = "owner")
private List<Animal> animals;

(动物内部实体)

  @ManyToOne
private Owner owner;

我有一个存储库,我在其中存放我的所有者

   @Override
public Owner create(String name, String email, int age, 
List<Animal> animals) {
    Owner owner = new Owner(name, email, age, animals);
    for(Animal animal: animals){
        animal.setOwner(owner);
    }
    getEntityManager().persist(owner);
    return owner;
}
}

所有者已正确保留,但未在动物表中设置外键。

我使用调试器检查了动物的所有者设置正确。

首先,我尝试保留导致错误的动物

   for(Animal animal: animals){
        animal.setOwner(owner);
        getEntityManager().persist(animal)
    } //caused an error

所以我考虑使用一种级联,以确保动物将所有者ID进入数据库,

@OneToMany(cascade = CascadeType.ALL)
private List<Animal> animals;

这也导致了错误

 "cause": {
  "detailMessage": "detached entity passed to persist: com.tolboll.zoo.data.entities.Animal",
  "stackTrace": [],
  "suppressedExceptions": []
},

我该怎么做,以确保所有者正确地坚持在动物实体中?

编辑:

这是传入的JSON正文

  {
    "name": "kristoffer",
    "email": "Kristofferlocktolboll@gmail.com",
    "age": 23,
    "animals": [{
        "id": 1,
        "name": "Simba",
        "weight": 110,
        "species": {
            "id": 1,
            "name": "Lion"
        }
    }]
}

1 个答案:

答案 0 :(得分:1)

出现该错误是因为您试图保留一个分离的实体:动物。

解决方案

在所有者实体中,保持原样(尽管CascadeType.MERGE足够):

@OneToMany(cascade = CascadeType.ALL)
private List<Animal> animals;

然后,在create方法中,将persist替换为merge

getEntityManager().merge(owner);

原因是animals列表需要进行合并操作。