JPA:将子实体添加到父实体

时间:2017-09-14 12:02:47

标签: hibernate jpa

我可能需要一些帮助,因为我对文档感到困惑:

我有一个父JPA实体:

public class Provider implements Serializable {
...
    @OneToMany(fetch = FetchType.LAZY)
    private List<Contact> contacts;

孩子:

public class Contact implements Serializable {
    ...
    @ManyToOne(fetch = FetchType.LAZY)
    private Provider provider;

如果我只是添加联系人,我希望JPA创建关系。

e.g:

Contact c = new Contact();
c.provider = providerX;
repo.save(c);

现在发生的事情是:

  • 将联系人插入DB(好)
  • 使用contact.provider列中的providerX.id(好)
  • provider_contact表中没有任何关系条目

我知道我可以将联系人设置为提供者的财产。 providerX.contacts.add(c); ... repo.save(providerX) 但这有点不方便,感觉不对。

如何在保存联系人时配置实体以创建此关系?

感谢您的帮助。 格里

1 个答案:

答案 0 :(得分:2)

首先,您需要在非拥有实体中添加mappedBy以建立双向关系,并初始化列表,以便您只需在需要时添加

 @OneToMany(fetch = FetchType.LAZY, mappedBy="provider")
private List<Contact> contacts = new ArrayList<>();//im supposing java 8

然后,由于你的关系是双向的,它的逻辑是将关系的每一边映射到另一边,因此你需要在另一边引用每一边

Contact c = new Contact();
c.setProvider(providerX);
providerX.getContacts().add(c);//please user getters and setters  
repo.save(c);

并且最后您需要在提供商内部级联提供商,以便当您保留联系人时提供商会被保留

 @ManyToOne(fetch = FetchType.LAZY,cascade=CascadeType.PERSIST)
private Provider provider;