Хех, добро пожаловать в потрясающую конфигурацию JPA.
В вашем случае у вас есть два варианта:
- Вручную сохранить новый объект; или
- Автоматически сохранить его.
Чтобы автоматически сохранить его, необходимо аннотировать отношения. Это распространенная идиома один-ко-многим:
@Entity
@Table(name = "PARENT_TABLE")
public class Parent {
@Id private Long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
private Collection<Child> children;
public void addChild(Child child) {
if (children == null) {
children = new ArrayList<Child>();
}
child.setParent(parent);
children.add(child);
}
}
@Entity
@Table(name = "CHILD_TABLE")
public class Child {
@Id private Long id;
@ManyToOne
private Parent parent;
public void setParent(Parnet parent) {
this.parent = parent;
}
}
Parent parent = // build or load parent
Child child = // build child
parent.addChild(child);
Из-за сохранения каскада это сработает.
Примечание: Вы должны сами управлять отношениями на уровне Java, следовательно, вручную устанавливая родителя. Это важно.
Без этого вам нужно вручную сохранить объект. Вам понадобится EntityManager, чтобы сделать это, в этом случае это так просто:
entityManager.persist(child);
В этот момент он будет работать правильно (при условии, что все остальное работает).
Для чисто дочерних сущностей я бы предпочел подход аннотации. Это просто проще.
Есть одна ошибка, которую я упомяну в JPA:
Parent parent = new Parent();
entityManager.persist(parent);
Child child = new Child();
parent.addChild(child);
Теперь я немного обеспокоен этим, но я полагаю, что у вас могут возникнуть проблемы, если вы сделаете это, потому что родитель был сохранен до добавления ребенка. Будьте внимательны и проверяйте это дело независимо от того, что вы делаете.