Gewusst wie: Auffüllen von foreign key-Werte in einer Hibernate + Spring JPA-Konfiguration, wenn die parent/child-Objekte sind persistent in der gleichen Zeit?
Habe ich zwei Objekte, Elternteil und Kind. Kind hat einen ausländischen key zurück zu PARENT_ID Feld in der ÜBERGEORDNETEN Tabelle (MySQL Datenbank).
Wenn ein Elternteil und Kind-Objekt erstellt/zusammengestellt in der gleichen Zeit, und bleiben bestehen, heißt, das Kind PARENT_ID foreign key wird nicht automatisch aufgefüllt.
Beispielcode:
@Entity
@Table(name = "PARENT")
public class Parent {
@Column(name = "PARENT_ID")
private Long parentId;
@OneToMany(mappedBy = "parent")
private List<Child> children;
}
@Entity
@Table(name = "CHILD")
public class Child {
@Column(name = "CHILD_ID")
private Long childId;
@Column(name = "PARENT_ID")
private Long parentId;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}
Habe ich zwei Proben für die Persistenz:
1) die Verwendung einer Hibernate-EntityManager:
@PersistenceContext
EntityManager em;
...
em.persist(parent);
2) Mit einem Spring Data JPA JpaRepository Beispiel:
public interface ParentRepository extends JpaRepository<Parent, Long> {
}
Und in meinem ParentServiceImpl:
@Autowired
private ParentRepository parentRepository;
...
public Parent save(Parent parent) {
return parentRepository.save(parent);
}
Was ist die empfohlene Strategie, um darüber zu gehen, bevölkern die foreign key? Sollte das Parent-Objekt gespeichert werden und erst dann das Kind-Objekt foreign key setzen an diesem Punkt? Oder gibt es eine Möglichkeit zu bestehen, alles auf einmal, mit der foreign key festgelegt wird, automatisch oder by reference?
Edit: Persistenz Proben Hinzugefügt.
Edit 2 (behoben!): Problem gelöst, wie pro Ryan Stewart ist der zweite Punkt. Ich entfernte die Lange parentId-Feld aus der Kind-Objekt, und legen Sie die @Column reference) für die parentId, die auf die get-Methode. Auch sicher zu set-up Referenzen korrekt (vor allem beim Kind, den Bezug zu Übergeordneten).
- Zeigen Sie den code, den Sie verwenden, um zu beharren beide.
- Fertig! Ich mache nur eine einzige bestehen call-in beiden Beispielen. Kaskaden und alle Aktualisierungen und Einfügungen, wo die Eltern foreign key ist pre-set (Elternteil zuerst gespeichert).
- Zeigen Sie uns den vollständigen code. Wie konstruieren Sie die Eltern und das Kind. Wie assoziieren Sie Sie? Sie reden über die Kaskaden, aber Sie haben nicht alle in den code geschrieben. Wenn Sie möchten, uns zu erklären, wie der code muss festgelegt werden, nach dem code, den Sie verwenden.
- Der code ist Komplex, deshalb wollte ich den Fokus auf das spezifische problem hatte ich mit einem einfachen Fall. Ryan Stewart Antwort das problem gelöst (seine 2. Punkt). Danke!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass code, der hat zwei Dinge, die verhindern, dass es funktioniert:
@Id
. Sie wahrscheinlich nur die linke ab, weil dies ein Beispiel ist, aber es ist einen Hinweis Wert.parent_id
. Kind hat sowohl eine Lange-Feld und ein Parent-Feld zugeordnet, der gleichen Spalte. Lange loswerden. Es ist die Beziehung, die Sie suchen.Danach, was Sie haben, es ist eine völlig traditionellen bidirektionale eins-zu-viele join-Spalte. Wenn es nicht funktioniert für Sie, dann machen Sie etwas falsch im code, wo Sie erstellen und speichern Sie Sie. Sehr wahrscheinlich bist du nicht das erstellen der Objekte korrekt. Korrekter code, der mit diesen Einrichtungen würde in etwa so Aussehen:
Beachten Sie insbesondere, dass das Kind, sollte festgelegt werden, in der Eltern wie auch die Eltern in das Kind. Bauen Sie keinen halb kaputten Objekt-Modell und erwarten, dass Hibernate zu bereinigen Ihre Durcheinander. Viele Menschen ignorieren dieses naheliegende Anforderung und Frage mich, warum Hibernate scheint instabil und/oder unzuverlässig.