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!
InformationsquelleAutor fruchtose | 2011-09-22
Schreibe einen Kommentar