Hallo allerseits
Folgendes (etwas vereinfachtes) Szenario:
Habe die Entity-Klasse Person , die wiederum eine Entity-Klasse Adresse hat. Eine separate Klasse ist für das Speichern, Löschen, Updaten etc. von Person-Entities zuständig:
Nun, habe ich eine weitere Entity-Klasse namens Firma, die wiederum unter anderen Referenzen auch eine Kontaktperson vom Typ Person hat. Eine separate Klasse ist auch hier für das Speichern, Updaten und Löschen von firma-Instanzen zuständig. Wenn ich jetzt Firma-Entity speichere, muss ich auch Person-Entity speichern (auf CASCADE habe ich verzichtet). Und, ich möchte ein rollback machen können, falls etws schief geht. Da meine sava-Methode in der Person-Persister Klasse einen eigenen EntityManager hat, Transaction startet und die Änderungen commitet, eignet sich diese beim Speichern der Firma-Entity nicht, da ich damit ein rollback evtl. nicht mehr machen kann. Heisst, ich muss den ganzen Code noch einmal in der Firma-Persister klasse implementeiren . Oder, in ich habe in der Person-Persister Klasse (oder einer anderen Helper-Klasse) die save-Methode, welche die Person-Entity speichert, jedoch ohne commit auszuführen. Dazu würde ich beim Aufruf dieser Methode den EntityManager übergeben, mit dem ich die Transaktion gestartet und auch am Schluss commiten werde. Sollte etwas irgendeinmal innerhalb dieser Transaction schief gehen, kann ich so problemloss ein rollback machen.
Nun finde ich das nicht schön: redundanter Code etc. Und, auf die Verwendung eines EntityManager auf der Application-Ebene würde ich auch gerne verzichten.
Gibt es da eine bessere Möglichkeit, das Problem zu lösen? Könnte ich evtl. in der save-Methode der Person-Persister abfragen, ob eine Transaction schon aktiv ist und falls ja, würde ich diese nutzen (die Frage ist aber auch, wie ich auf die EntityManager-Instanz kommen würde), und fall nicht, würde ich eine neue Transaction starten, nachdem ich zuerst einen neuen EntityManager erstellt habe?
Danke für jeden Typ.
Hinweis:
Es handelt sich um eine JavaSE Anwendung:
[XML]<persistence-unit name="mypu" transaction-type="RESOURCE_LOCAL">[/XML]
Folgendes (etwas vereinfachtes) Szenario:
Habe die Entity-Klasse Person , die wiederum eine Entity-Klasse Adresse hat. Eine separate Klasse ist für das Speichern, Löschen, Updaten etc. von Person-Entities zuständig:
Java:
public void save(Person person) throws Exception {
if (person.getId() != null && person.getId().intValue() > 0) {
update(person);
} else {
EntityManager em = HelperClass.createEntityManager();
Adresse a = person.getAdresse();
em.getTransaction().begin();
if (a.getId() == null) {
em.persist(a);
} else {
em.merge(a);
}
em.persist(person);
try {
em.getTransaction().commit();
} catch (Exception e) {
logger.error(
"Fehler ... ", e);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
throw e;
} finally {
if (em.isOpen()) {
em.close();
}
}
}
}
Nun, habe ich eine weitere Entity-Klasse namens Firma, die wiederum unter anderen Referenzen auch eine Kontaktperson vom Typ Person hat. Eine separate Klasse ist auch hier für das Speichern, Updaten und Löschen von firma-Instanzen zuständig. Wenn ich jetzt Firma-Entity speichere, muss ich auch Person-Entity speichern (auf CASCADE habe ich verzichtet). Und, ich möchte ein rollback machen können, falls etws schief geht. Da meine sava-Methode in der Person-Persister Klasse einen eigenen EntityManager hat, Transaction startet und die Änderungen commitet, eignet sich diese beim Speichern der Firma-Entity nicht, da ich damit ein rollback evtl. nicht mehr machen kann. Heisst, ich muss den ganzen Code noch einmal in der Firma-Persister klasse implementeiren . Oder, in ich habe in der Person-Persister Klasse (oder einer anderen Helper-Klasse) die save-Methode, welche die Person-Entity speichert, jedoch ohne commit auszuführen. Dazu würde ich beim Aufruf dieser Methode den EntityManager übergeben, mit dem ich die Transaktion gestartet und auch am Schluss commiten werde. Sollte etwas irgendeinmal innerhalb dieser Transaction schief gehen, kann ich so problemloss ein rollback machen.
Nun finde ich das nicht schön: redundanter Code etc. Und, auf die Verwendung eines EntityManager auf der Application-Ebene würde ich auch gerne verzichten.
Gibt es da eine bessere Möglichkeit, das Problem zu lösen? Könnte ich evtl. in der save-Methode der Person-Persister abfragen, ob eine Transaction schon aktiv ist und falls ja, würde ich diese nutzen (die Frage ist aber auch, wie ich auf die EntityManager-Instanz kommen würde), und fall nicht, würde ich eine neue Transaction starten, nachdem ich zuerst einen neuen EntityManager erstellt habe?
Danke für jeden Typ.
Hinweis:
Es handelt sich um eine JavaSE Anwendung:
[XML]<persistence-unit name="mypu" transaction-type="RESOURCE_LOCAL">[/XML]
Zuletzt bearbeitet: