Wie verwende ich JPA zu bestehen eine Map (java.util.Karte) Objekt in einer Einheit und sorgen für das fortbestehen Kaskaden?
Ich habe vor kurzem angefangen zu spielen, um mit dem Spielen! Framework für Java, version 1.2.3 (die neuesten). Beim Test der Rahmen, stieß ich auf ein seltsames problem beim Versuch zu bestehen Map
Objekt innerhalb einer Hibernate-Entität namens FooSystem
. Das Map-Objekt-Karten eine lange, eine Hibernate-Entität, die ich genannt habe Foo
, mit der Erklärung Map<Long, Foo> fooMap;
Mein problem ist wie folgt: Die richtigen Tabellen erstellt, als ich kommentierte Sie. Allerdings, wenn die FooSystem
Objekt fs
beibehalten wird, werden die Daten in fs.fooMap
ist nicht!
Hier ist der code, den ich verwende für die Entitäten. Zunächst ist Foo
:
package models.test;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import play.db.jpa.Model;
@Entity
public class Foo extends Model
{
@ManyToOne
private FooSystem foosystem;
public Foo(FooSystem foosystem)
{
this.foosystem = foosystem;
}
}
Und hier ist FooSystem
:
package models.test;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import play.db.jpa.Model;
@Entity
public class FooSystem extends Model
{
@ManyToMany(cascade = {CascadeType.ALL, CascadeType.PERSIST})
@JoinTable(
name = "fooMap",
joinColumns = @JoinColumn(name = "foosystem"),
inverseJoinColumns = @JoinColumn(name = "foo")
)
private Map<Long, Foo> fooMap = new HashMap<Long, Foo>();
public FooSystem()
{
Foo f1 = new Foo(this);
Foo f2 = new Foo(this);
fooMap.put(f1.getId(), f1);
fooMap.put(f2.getId(), f2);
}
public Map<Long, Foo> getFooMap()
{
return fooMap;
}
}
Hier ist die Controller
Klasse bin ich zum testen mein set-up:
package controllers;
import javax.persistence.EntityManager;
import models.test.FooSystem;
import play.db.jpa.JPA;
import play.mvc.Controller;
public class TestController extends Controller
{
public static void index() {
EntityManager em = JPA.em();
FooSystem fs = new FooSystem();
em.persist(fs);
render();
}
}
Den Spielen! framework automatisch erstellt eine Transaktion, für die der HTTP-Anforderung. Zwar sind die Daten eingefügt, in der foo
und foosystem
Tabellen, nichts ist immer eingefügt in die foomap
Tabelle, die das gewünschte Ergebnis. Was kann ich dagegen tun? Was bin ich?
- welche version von JPA sind, Sie verwenden.JPA2 hat '@ElementCollection", die dies tut, download.oracle.com/javaee/6/api/javax/persistence/...
- Ich bin mit JPA2 als eine Angelegenheit von der Tat. Ich versuchte Ihren Vorschlag und es hat funktioniert, nachdem ich einige Anpassungen vorgenommen, um die Reihenfolge, in der ich mein gespeichertes Personen! Ich werde Entsendung die komplette Lösung innerhalb der nächsten 24 Stunden! Es ist sehr spät in der Nacht, wo ich Lebe, und ich brauche Schlaf. Danke für Eure Hilfe! Ich habe gesehen, das
@ElementCollection
Anmerkung an anderer Stelle im Internet während der Suche nach meinem problem, aber mit@ElementCollection
hat nicht funktioniert, das erste mal ich es versuchte. Ich hatte es geschrieben, bis jetzt. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich es geschafft, dieses problem zu lösen, mithilfe der Beratung von Java-Ka Baby. Das Problem war eigentlich nicht in meinem
Model
Klassen; das problem lag innerhalb desController
. Genauer gesagt, wurde ich speichern die Elemente in der falschen Reihenfolge. Sobald ich merkte, dass mit der@ElementCollection
annotation auf derMap<Long, Foo>
produziert die gleiche Wirkung wie die join-Tabelle, die ich manuell angeben, ich versuchte, ich dachte experiment, wo ich wieder dachte, wie ich war Rettung meines Entitäten.In der code, den ich oben gepostet, sehen Sie in der
FooSystem
Konstruktor, der zweiFoo
Objektef1
undf2
sind infooMap
vor derFoo
Objekte persistent gespeichert werden. Ich erkannte, dass, wennf1
ist nicht in der Datenbank, wenn Sie in die Karte, wie ist die JPA verwenden können Sie seine ID als Fremdschlüssel in der verknüpften Tabelle?Wenn Sie sehen können, wohin ich gehe mit dieser Argumentation Folgen, können Sie sehen, dass die offensichtliche Antwort ist, dass die JPA ist nicht in der Lage, dies zu erreichen erstaunliche Kunststück, mit einem Fremdschlüssel zum Verweis auf einen nicht vorhandenen Schlüssel. Das bizarre an der Sache ist, dass die Spielen! Konsole nicht beachten, keine Fehler bei den original-code habe ich gepostet, obwohl es war überhaupt nicht korrigieren. Entweder die framework verschluckt jeden
Exception
geworfen während des Prozesses, oder ich habe code geschrieben, dass sollte produzieren eineException
.Also um das problem zu beheben, Bestand ich die
Foo
Entitäten, bevor irgendwelche Operationen wurden durchgeführt auf Sie. Erst dann habe ich Sie infooMap
. Endlich einmalfooMap
bevölkert war, Bestand ich dieFooSystem
Einheit.Hier ist die korrigierte
TestController
Klasse:Und da ich geändert
FooSystem
ist, ist hier der endgültige code für die Klasse: