JPA:只有在持久保存主对象时,是否可以在数组中保留子对象?

时间:2011-12-31 19:50:38

标签: jpa persistence eclipselink cascade

我正在使用JSF和JPA(Eclipse链接)开发Web应用程序。我有两个具有双向OneToMany关系的实体。所有者实体是联系人,目标实体是客户。单个客户可以有多个联系人,如电子邮件,电话等。当最终用户添加新客户时,他还会立即添加联系人。即使在向该客户添加联系人之后,也需要取消新客户的保存。我尝试添加该功能,但以下列方式失败。

可以通过持久性直接实现那个场景吗?

联系实体

....
public class Contact implements Serializable {
    ....   
    @ManyToOne
    Customer customer;
    ....   

客户实体

....
public class Customer implements Serializable {
    ....
    @OneToMany(mappedBy = "customer")
    private List<Contact> contacts;
    ....   

向客户添加新联系人(当前是Customer类的对象)

Contact contact = new Contact();
contact.setCustomer(current);
....
current.getInstitutionContacts().add(contact);

当电流已经是持久电流时,这种方法有效。如果我尝试添加联系人以暂停其中一个,则会有java.lang.NullPointerException

我可以通过努力来实现这一功能,但是有没有什么方法可以只收集数组中的联系人并仅在客户持久存在时(如果只有)持久存在?通过使用级联持久或懒惰提取等?

1 个答案:

答案 0 :(得分:0)

听起来您希望联系人是组件,而不是实体

不同之处在于实体拥有自己的生命周期;它存在于其关联范围之外,删除父级不一定要删除子级。此外,如果孩子是实体,其他课程也可以与该孩子建立关系。

组件完全绑定到父组件。如果父母离开,他们会自动离开。它们不能被其他协会或其他实体引用。这就像它们是父类的简单属性。

唯一需要注意的是,我不知道所有JPA实现是否都支持组件集合。

this documentation。特别是部分说:“您还可以在可嵌入对象中使用关联注释(即@OneToOne,@ ManyToOne,@ OneToMany或@ManyToMany)。要覆盖关联列,您可以使用@AssociationOverride。”

如果您正在使用的JPA实现,您可以使用@Embeddable注释和@OneToMany

编辑: - 我也在http://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Collections找到了信息。