2011-05-10 185 views
0

我有一个类居民和ResidentInfo 之间的关系一对多ResidentInfo不应该无居民须存在,但ResidentInfo不需要JPA(休眠)一对多的关系,空

这里是我的课:

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为空(但由于居民在同一时间创建我不能指定值!)

而且即使是首次创建的居民,我有这样的错误但我不知道为什么:

detached entity passed to persist: models.ResidentInfo 

那么如何解决这些问题呢?

回答

2

要解决您的问题,您应该首先提供ResidentInfo类中的setter方法来设置info实例所属的Resident对象。它可能看起来像这样

public void setResident(Resident resident) { 
    this.resident = resident; 
} 

此外,ResidentInfo对象只能在Resident类中完成。您应该提供一种方法将新的ResidentInfo对象添加到包含的列表中。添加ResidentInfo对象的一部分是设置与其关联的Resident对象。该代码可能是这个样子

public void addResidentInfo(ResidentInfo residentInfo) { 
    residentInfo.setResident(this); 
    infos.add(residentInfo); 
} 

有了这些行列表中的每个对象包含到与它相关的居民实例的引用。所以当你坚持所有的对象时,必要的引用(以及任何必需的ID)都被设置。

在旁注中,您应该在JPA注释中检查Cascade信息。你提供了两个不同含义的不同注释。

+0

嗨,我压制了“cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH}”是否正确? 另外我已经测试了你的代码,这只适用于部分工作,当我想将新的ResidentInfo添加到现有的居民这不起作用 – Bouki 2011-05-10 10:59:14

+0

你是什么意思,它不起作用?使用指定的方法添加新的ResidentInfo时,结果如何? – Osiris76 2011-05-10 11:17:54

+0

我没有错误,但没有插入所有ResidentInfos记录 – Bouki 2011-05-10 11:20:29