JPA: Verwendung von Transaktionen mit JTA EntityManager?
Zunächst diese Lösung ist keine option für mich, denn ich kann es nicht ändern, die persistence-unit.
Mein problem ist, dass ich eine JTA-EntityManager aber ich brauche für genau einen use-case etwas wie eine Transaktion:
public boolean saveWithResult(PointsValidityPeriod pointsValidityPeriod)
{
//TODO use transaction here
super.save(pointsValidityPeriod);
if (updatePrevious(pointsValidityPeriod.getValidFrom()) != 1)
{
logger.error("Update of Period was not possible, because UPDATE returned no single result.");
return false;
}
pointsValidityPeriodEvent.fire(pointsValidityPeriod);
return true;
}
Speichern-Methode (die ich nicht ändern kann):
public void save(T entity)
{
getEntityManager().persist(entity);
}
Sehen Sie, dass es ein speichern-Aufruf, aber diese speichern müssen werden zurückgesetzt, wenn das update schief ging, also wie kann ich das erreichen? Irgendwelche Ideen?
Der springende Punkt bei der JTA ist es, Transaktionen zu verwalten. In welcher Umgebung sind Sie executingyour app? Ein application server mit EJB? Dann verwenden EJBs zur Abgrenzung von Transaktionen: das ist Ihre wichtigste Punkt.
Ja, wir verwenden EJB-JBoss.
Eine EJB ist, von Standard -, Transaktions. Alle code-inside EJB-Methoden ausgeführt wird, in einer Transaktion standardmäßig.
Änderte ich die Methode Aufrufe. Wenn ich sage
Ja, wir verwenden EJB-JBoss.
Eine EJB ist, von Standard -, Transaktions. Alle code-inside EJB-Methoden ausgeführt wird, in einer Transaktion standardmäßig.
Änderte ich die Methode Aufrufe. Wenn ich sage
if (updatePrevious() == 2) { => don't invoke save.}
im saveWithResult Methode, dann updatePrevious wird nicht zurückgesetzt, also UPDATE ausgeführt wurde, aber EINFÜGEN (speichern) nicht, also wie ist das transaktionale? Ich verstehe nicht, dass.
InformationsquelleAutor Bevor | 2012-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt alles von Ihren Methoden transactional-Annotationen. Wenn Sie noch keine haben, als standardmäßig die Transaktion Grenze gesetzt ist, um die business-Methode, wie schon von JB.
So, die ganze Methode ist eine Transaktion. Normalerweise wird die Transaktion Verwaltung von
save
Methode wäre wichtig (es ist ein Unterschied, ob esREQUIRED
oderREQUIRES_NEW
), aber in diesem Fall, du machst einen lokalen Methodenaufruf -- nicht in eine business-Methode aufrufen, so dass jede Transaktion-management-Einstellungen fürsave
Methode nicht anwenden hier.Daher, wenn die
update
fehl, können Sie entweder auf Basis automatischer rollback der Transaktion (wenn es ein EntityManager-Aufruf, erzeugt Ausnahme, dass die rollback-Tx), oder Sie können manuell injizierenSessionContext
und aufrufensetRollbackOnly()
auf es, etwas zwischen den Zeilen:Sollte dann nicht die annotation @ Resource? Siehe javahowto.blogspot.fr/2006/06/..., wie Sie die SessionContext aus einer EJB.
Ah, natürlich JB -
@Resource
! Sorry Jungs, zu viel CDI macht mich zu einem dummen Jungen!InformationsquelleAutor Piotr Nowicki
Ich habe die Lösung, aber ich weiß nicht, warum das funktioniert. Vielleicht könnte jemand es mir erklären.
In meiner backing-bean gibt es die save-Methode. Es gibt 2 Personen. getEntity() wird das aktuelle Element verwendet, durch die backing-bean, currentValidityPeriod ist ein weiteres Beispiel von einer Person hält, die die aktuelle Datenbank-Status der Entität, abgeholt currentValidityPeriod = pointsValidityService.findCurrent(); findCurrent() ist nur eine Methode, die zwar ein TypedQuery:
Dies ist die save-Methode aufgerufen, indem die view. Wie Sie sehen können, habe ich nur die aktuelle Person, die den service-save-Methode. In der vorherigen Einheit (currentValidityPeriod), habe ich einen anderen Wert.
Dies ist die service-Methode, die aufgerufen werden:
...und Oberklasse die Methode save:
Warum ist der Entity-Manager behalten Sie die neue Entität und update das alte? Ich gebe EINE Entität der Entity-Manager. Obwohl dies das erwartete Verhalten ist, würde ich gerne wissen, warum das funktioniert.
update
auf diese Entität.InformationsquelleAutor Bevor