Ich habe 2 Klassen namens PurchaseList.java und PurchaseListItems.java
Ich muss PurchaseList in PurchaseListItems zuordnen
PurchaseList.java
%Vor%PurchaseListItems.java
%Vor%Alles ist gut, aber ich bekomme null in pl_id. Bitte sag, wo ich falsch liege
Ihre Zuordnung definiert zwei unabhängige unidirektionale Beziehungen. Was Sie wollen, ist eine bidirektionale Beziehung. Der folgende Code wird die bidirektionale Beziehung
herstellen %Vor%Das Attribut mappedBy ist erforderlich, da der Provider nicht automatisch feststellen kann, dass die angegebenen Beziehungen tatsächlich eine einzelne Beziehung bilden. Man könnte den Java-Typ des Instanzmitglieds verwenden, aber was ist, wenn mehrere Elemente desselben Typs vorhanden sind. Und es gibt viele Szenarien, in denen Sie zwei einzelne Beziehungen haben. Beispiel:
OneToMany: Benutzer - & gt; ForumThread (die Threads, die vom Benutzer erstellt wurden)
ManyToOne: ForumThread - & gt; Benutzer (der Benutzer, der den Thread geschlossen hat. Offensichtlich nicht unbedingt derjenige, der den Thread gestartet hat)
Dies sind zwei unabhängige Beziehungen und müssen als solche behandelt werden. Sie würden ziemlich überrascht sein, wenn Ihre Persistenz nur eine bidirektionale Beziehung daraus hervorbringen würde, nur weil die Typen und Multiplizität übereinstimmen.
Beachten Sie auch, dass bidirektionale Beziehungen nicht automatisch von einem JPA-Provider verwaltet werden, dh die inverse Seite wird nicht automatisch in Ihrem Objektmodell und somit nicht in der db aktualisiert / gesetzt. Das musst du selbst machen. By the way, in allen meinen Projekten bidirektionale Beziehungen waren ein Schmerz in den Arsch und ich denke, es ist ratsam, sie zu vermeiden.
Aus irgendeinem Grund zugeordnet von mir funktioniert nicht mit postgres sql und Hibernate4
Unter dem Mapping funktioniert
PurchaseList.java
%Vor%PurchaseListItems.java
%Vor%Hinweis: Sie müssen die Identität verwenden oder explizit die Sequenz für ID-Spalten für Postgres erwähnen.
%Vor%Prüfen Sie, ob Sie purchaseListId mit einem gültigen Wert (eine erstellte PurchaseList -Instanz) gefüllt haben, wenn Sie ein erstellen PurchaseListItems Wert.
Es ist besser, mappedBy wie unten beschrieben zu verwenden, damit viele Seiten die Beziehung beibehalten können.
%Vor%Dies ist was ich vermisste, als ich ein Objekt erstelle.
Thnaks für deine Antworten
Die @JoinColumn-Annotation gehört auf der @ManyToOne-Seite der Beziehung - aber nicht auf der @ OneToMany-Seite - entfernt sie von der @ OneToMany-Seite.
Cascade wird verwendet, um DELETE / READ / UPDATE-Operationen zu kaskadieren, aber es füllt nicht automatisch die ID-Spalte auf der "untergeordneten" Seite eines Fremdschlüssels. Tatsächlich füllt es die Java-Verweise auf Objekte auf beiden Seiten der FK-Beziehung nicht auf. Sie müssen Beziehungsdaten auf beiden Seiten bidirektionaler Beziehungen manuell einrichten:
myPurchaseListItem.setPurchaseList (myPurchaseList);
myPurchaseList.setPurchaseListItem (myPurchaseListItem);
Aus der JPA 2 Spezifikation:
Bidirektionale Beziehungen zwischen verwalteten Entitäten werden basierend auf Referenzen beibehalten, die von der besitzenden Seite der Beziehung gehalten werden. Es liegt in der Verantwortung des Entwicklers, dass die auf der besitzenden Seite gehaltenen und die auf der inversen Seite gespeicherten Referenzen im Speicher bei jeder Änderung konsistent bleiben. Im Falle unidirektionaler Eins-zu-Eins und Eins-zu-Viele-Beziehungen ist es Aufgabe des Entwicklers, sicherzustellen, dass die Semantik der Beziehungen eingehalten wird. [29]
Es ist besonders wichtig sicherzustellen, dass Änderungen an der inversen Seite einer Beziehung zu entsprechenden Aktualisierungen auf der besitzenden Seite führen, um sicherzustellen, dass die Änderungen nicht verloren gehen, wenn sie mit der Datenbank synchronisiert werden.