Wie verwende ich JPA, um ein Map (java.util.Map) -Objekt innerhalb einer Entity persistent zu machen und die Persistenzkaskaden sicherzustellen?

8

Ich habe kürzlich angefangen, mit dem Play herumzuspielen! Framework für Java, Version 1.2.3 (die neueste). Beim Testen des Frameworks stieß ich auf ein merkwürdiges Problem, als ich versuchte, ein Map -Objekt in einer Hibernate-Entity namens FooSystem zu erhalten. Das Map-Objekt bildet eine Long auf eine Hibernate-Entity ab, die ich Foo mit der Deklaration Map<Long, Foo> fooMap;

aufgerufen habe

Mein Problem ist wie folgt: Die richtigen Tabellen werden erstellt, wie ich sie annotiert habe. Wenn das FooSystem -Objekt fs jedoch beibehalten wird, sind die Daten in fs.fooMap nicht!

Hier ist der Code, den ich für die Entitäten verwende. Erstens ist Foo :

%Vor%

Und hier ist FooSystem :

%Vor%

Hier ist die Klasse Controller , die ich verwende, um mein Setup zu testen:

%Vor%

Das Spiel! Framework erstellte automatisch eine Transaktion für die HTTP-Anfrage. Obwohl Daten in die Tabellen foo und foosystem eingefügt werden, wird nichts in die Tabelle foomap eingefügt, was das gewünschte Ergebnis ist. Was kann ich dagegen tun? Was vermisse ich?

    
fruchtose 22.09.2011, 20:39
quelle

1 Antwort

4

Ich habe es geschafft, dieses Problem mit dem Rat von Java Ka Baby zu lösen. Das Problem war nicht in meinen Model -Klassen; Das Problem lag innerhalb der Controller . Insbesondere habe ich die Entitäten in der falschen Reihenfolge gespeichert. Nachdem ich festgestellt hatte, dass die @ElementCollection Annotation für Map<Long, Foo> die gleichen Effekte wie die von mir manuell angegebene Join-Tabelle erzeugte, versuchte ich zu experimentieren, wo ich überlegte, wie ich meine Entitäten speicherte.

Im obigen Code können Sie im Konstruktor FooSystem sehen, dass zwei Foo -Objekte, f1 und f2 , in fooMap eingefügt werden, bevor die Foo -Objekte beibehalten werden. Ich erkannte, dass, wenn f1 nicht in der Datenbank ist, wenn es in die Karte eingefügt wird, wie kann JPA seine ID als Fremdschlüssel in der Join-Tabelle verwenden?

Wenn Sie mit dieser Argumentation sehen können, wohin ich gehe, können Sie sehen, dass die offensichtliche Antwort darin besteht, dass JPA nicht in der Lage ist, dieses erstaunliche Kunststück zu vollbringen, einen fremden Schlüssel als Referenz zu verwenden ein nicht vorhandener Schlüssel Das Bizarre ist, dass das Spiel! Die Konsole hat überhaupt keine Fehler für den ursprünglichen Code bemerkt, den ich gepostet habe, obwohl es überhaupt nicht korrekt war. Entweder schluckte das Framework alle Exception , die während des Prozesses geworfen wurden, oder ich habe Code geschrieben, der sollte ein Exception erzeugen.

Um das Problem zu beheben, habe ich die Entitäten Foo beibehalten, bevor irgendwelche Operationen für sie ausgeführt wurden. Erst dann habe ich sie in fooMap gesetzt. Schließlich, nachdem fooMap aufgefüllt wurde, habe ich die Entität FooSystem beibehalten.

Hier ist die korrigierte Klasse TestController :

%Vor%

Und da ich FooSystem geändert habe, ist hier der letzte Code für diese Klasse:

%Vor%     
fruchtose 23.09.2011, 17:24
quelle