我正在使用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添加新联系人(current是Customer类的对象)
Contact contact = new Contact();
contact.setCustomer(current);
....
current.getInstitutionContacts().add(contact);
当current已经是持久化的current时,这是可行的。如果我尝试将一个联系人添加到尚未持久化的联系人,则会有一个java.lang.NullPointerException
。
我可以解决这个问题,但有没有什么方法可以将联系人收集到数组中,并仅在持久化客户时才持久化它们?通过使用层叠持久化或惰性获取,等等?
发布于 2012-01-01 04:26:09
听起来你想让联系人成为组件,而不是实体。
不同之处在于,一个实体有它自己的生命周期;它生活在它的关联范围之外,删除父实体并不一定要删除子实体。此外,如果一个子对象是一个实体,其他类也可以与该子对象建立关系。
组件完全绑定到父组件。如果父母不在,他们就会自动离开。它们不能被其他关联或其他实体引用。它们就像是父类的简单属性。
唯一需要注意的是,我不知道是否所有的JPA实现都支持一个组件集合。
参见this documentation。特别是说:“你也可以在可嵌入的对象中使用关联注释(如@OneToOne、@ManyToOne、@OneToMany或@ManyToMany)。要覆盖关联列,可以使用@AssociationOverride。”
如果您正在使用的JPA实现支持,则可以使用@Embeddable注解和@OneToMany
编辑:--我也在这里找到了http://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Collections的信息。
https://stackoverflow.com/questions/8690227
复制相似问题