首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JPA:是否可以仅当主对象被持久化时才持久化数组中的子对象?

JPA:是否可以仅当主对象被持久化时才持久化数组中的子对象?
EN

Stack Overflow用户
提问于 2012-01-01 03:50:38
回答 1查看 1.2K关注 0票数 0

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

这可以通过坚持不懈直接实现吗?

联系实体

代码语言:javascript
运行
复制
....
public class Contact implements Serializable {
    ....   
    @ManyToOne
    Customer customer;
    ....   

客户实体

代码语言:javascript
运行
复制
....
public class Customer implements Serializable {
    ....
    @OneToMany(mappedBy = "customer")
    private List<Contact> contacts;
    ....   

向Customer添加新联系人(current是Customer类的对象)

代码语言:javascript
运行
复制
Contact contact = new Contact();
contact.setCustomer(current);
....
current.getInstitutionContacts().add(contact);

当current已经是持久化的current时,这是可行的。如果我尝试将一个联系人添加到尚未持久化的联系人,则会有一个java.lang.NullPointerException

我可以解决这个问题,但有没有什么方法可以将联系人收集到数组中,并仅在持久化客户时才持久化它们?通过使用层叠持久化或惰性获取,等等?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8690227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档