我有一个休眠的应用程序,我想在其中保留一个所有者。
一个主人可以养很多动物
(在所有者内部)
@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"
}
}]
}
答案 0 :(得分:1)
出现该错误是因为您试图保留一个分离的实体:动物。
解决方案
在所有者实体中,保持原样(尽管CascadeType.MERGE
足够):
@OneToMany(cascade = CascadeType.ALL)
private List<Animal> animals;
然后,在create
方法中,将persist
替换为merge
:
getEntityManager().merge(owner);
原因是animals
列表需要进行合并操作。