JEE, EntityManager.persist() und Autoincrem Frage

fsmarine

Mitglied
Hallo Leute,

ich habe folgenden Code
Code:
    @Override
    public void createXMLDescriptor(XMLDescriptor descriptor) throws XMLDescriptorException {
        try {
            em.persist(descriptor);
        } catch (Exception e) {
            throw new XMLDescriptorException(e.getMessage());
        }
    }

Das Persistieren funktioniert auch wunderbar, nur würde ich wohl gerne nachdem ich das Objekt in die DB abgespeichert habe auch den automatisch erzeugten PrimaryKey in die Instanz laden :-(...

Ich finde aber absolut keine Möglichkeit den PK in den descriptor zu laden...

Gibt es dafür eine Elegante und einfache Möglichkeit ?
 
Hi, die schnellste Möglichkeit, wenn auch nicht die eleganteste:

Du stattest den descriptor mit einem Attribut aus, welches ihn identifiziert. Beispielsweise eine eigene Component ID in Kombination mit dem Attribut Classname o.ä..

Nach dem persist(...) holst Du das mit em.find(...) heraus. Beim SELECT Statement musst Du darauf achten, Deine Attribute mit anzugeben.

Wenn Du etwas anderes als null erhältst, kannst Du nach der ID fragen.
Ist jetzt quick & dirty aber funktioniert.

Grüße, Tim

P.S. noch etwas: Normalerweise wird die Id, genauso wie alle anderen gemappten Attribute, automatisch in die Instanz einer Klasse aus der DB geladen,
wenn man mit get(...) oder find(...) lädt.
 
Zuletzt bearbeitet:
Hallo,

nachdem du em.persist() mit deiner Descriptorinstanz aufgerufen hast, ist diese unter der Verwaltung des EntityManager. Sprich - nachdem der EntityManager die Daten in die Datenbank geschrieben hat, ist in der Instanz auch das PrimaryKey Feld belegt.

Da ich jetzt keine Ahnung habe, von wo und wie du die Methode aufrufst, kann ich jetzt auch nicht sagen, wann der EntityManager die Änderungen letztendlich schreibt.
Um es "manuell" zu steuern, kannst du nach dem em.persist() ein em.flush() aufrufen.
Dannach solltest du auf den PK zugreifen können, also quasi so

Java:
em.persist(descriptor);
em.flush();
System.out.println(descriptor.getId());  //getter ggf. anpassen

hth,
THMD
 
Hi,

bei flush() unbedingt beachten: Der EntityManager führt dann alles aus, was noch in der Pipeline ist, nicht nur die gerade aktuelle Operation!

Grüße, Tim
 

Neue Beiträge

Zurück