我在类Resident和ResidentInfo之间有一个关系OneToMany 如果没有Resident,ResidentInfo不应该存在,但不需要ResidentInfo
以下是我的课程:
public class Resident {
...
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "resident")
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public List<ResidentInfo> infos;
}
public class ResidentInfo {
...
@ManyToOne(optional = false)
public Resident resident;
public String label;
public String value;
}
我是JPA的新手,也许我做错了。
问题在于,当我尝试一次插入数据时(同时创建驻留及其信息)我有一个空例外。
这是因为ResidentInfo.resident.id为null(但我无法指定值,因为Resident是在同一时间创建的!)
即使首先创建了居民,我也有这个错误,但我不知道为什么:
detached entity passed to persist: models.ResidentInfo
那么如何解决这些问题?
答案 0 :(得分:2)
要解决您的问题,您应该首先在ResidentInfo类中提供一个setter方法来设置info实例所属的Resident对象。它可能看起来像这样
public void setResident(Resident resident) {
this.resident = resident;
}
此外,只能在Resident类中添加ResidentInfo对象到Resident对象。您应该提供一种方法来将新的ResidentInfo对象添加到包含的列表中。添加ResidentInfo对象的一部分是设置与之关联的Resident对象。代码可能看起来像这样
public void addResidentInfo(ResidentInfo residentInfo) {
residentInfo.setResident(this);
infos.add(residentInfo);
}
使用这些行,列表中的每个对象都包含对与之关联的Resident实例的引用。因此,当您持久保存所有对象时,将设置必要的引用(以及任何所需的ID)。
在旁注中,您应该检查JPA注释中的Cascade信息。您提供了两种不同含义的注释。