EntityManager wirft TransactionRequiredException auf merge() in der JBoss JSF-bean
Ich habe eine JSF-Anwendung auf JBoss 5.0.1 GA eine Liste der Benutzer in einer Tabelle und erlauben das löschen einzelner Benutzer über eine Schaltfläche neben jedem user.
Wenn deleteUser aufgerufen wird, wird der Anruf wird an einen UserDAOBean das wird ein EntityManager injiziert von JBoss.
Ich bin mit dem code
public void delete(E entity)
{
em.remove(em.merge(entity));
}
um den Benutzer zu löschen (code war c&p aus einem JPA tutorial). Nur zum telefonieren em.remove(entity) hat keine Wirkung und verursacht noch immer die gleiche Ausnahme.
Wenn diese Linie erreicht ist, ich bin immer eine TransactionRequiredException:
(überspringen offenbar irrelevant stacktrace-Zeug)
...
20:38:06,406 FEHLER [[Faces-Servlet]]
- Servlet.service() for servlet Faces
Servlet warf Ausnahme
javax.die Persistenz.TransactionRequiredException:
EntityManager muss der Zugang in einem
Transaktion an
org.jboss.jpa.- Bereitstellung.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory.java:155)
bei
org.jboss.jpa.tx.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:192)
bei
an.fhj.itm.utils.DAOImplTemplate.löschen(DAOImplTemplate.java:54)
bei
an.fhj.itm.UserBean.löschen(UserBean.java:53)
bei
Sonne.reflektieren.NativeMethodAccessorImpl.invoke0(Muttersprache
Methode)...
Ich habe bereits versucht, wickeln Sie eine manuell verwaltete Transaktion (em.getTransaction().begin() + .commit () ), aber dies schlug fehl, da es nicht gestattet ist innerhalb der JBoss-container. Ich hatte keinen Erfolg mit UserTransaction entweder. Das suchen im Internet für dieses Problem tauchte auch keinen ähnlichen Fall und Lösung.
Hat jemand ähnliches erlebt vor und gefunden eine Lösung?
- "Ich habe bereits versucht, wickeln Sie eine Transaktion um ihn herum, doch dies schlug fehl, da es nicht gestattet ist innerhalb der JBoss-container." - was ist nicht erlaubt? Transaktionen? Nicht wahr. Bitte aktualisieren Sie und erklären Sie diese Ausführlicher.
- Und warum denkst du, es ist notwendig, zu verschmelzen, bevor Sie Sie entfernen ein Objekt? Wenn etwas falsch ist, würde ich bestreiten.
- Geklärt (hoffe ich). Ich meinte die manuelle Verwaltung von Transaktionen auf den EntityManager. Des weiteren ist das entfernen(merge()) vorhanden ist, wird in Beispielen über das web (auch für Oracle). Dennoch versuchte sich ein einfacher entfernen, was verursacht noch immer die gleiche Ausnahme.
- Ich glaube nicht, dass ich würde empfehlen, dass merge. Nehmen Sie es aus und sehen, wenn Ihre situation verbessert.
- Nein ist es nicht. Sorry.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gefunden the missing link.
Es wurde in der Tat eine fehlende Transaktion aber die Lösung war nicht zu verwenden den EntityManager zu behandeln, es aber zur Beurteilung einer injizierten UserTransaction.
Danke an alle Vorschläge, die irgendwie über 100 Ecken führen zu dieser Lösung.
Weiß, das ist eine alte Frage, aber nur, wenn jemand stolpert über diese, wie mir.
Versuchen
Das ist, was wir in all unseren @Stateful beans.
Wenn Sie Naht, Sie können auch
@Transactional(TransactionPropagationType.REQUIRED)
annotation.Sind Sie sicher, dass Sie kommentierten Sie die bean mit @Stateless oder registrieren Sie es mit xml?
Versuchen add transaction-annotation, um Sie code, kann dies helfen:
Aber es scheint seltsam, denn dies ist der Standardwert, wenn Sie nicht setzen es ausdrücklich.
@Stateless
,@Local
usw. mit den dazugehörigen container) erstellen Sie sich Ihre eigene Transaktion.nur eine Anmerkung: wir liefen in das gleiche Problem heute stellte sich heraus, dass jemand markiert hatte, die EJB-als TransactionAttributeType.NOT_SUPPORTED UND die Methode als TransactionAttributeType.ERFORDERLICH, wodurch die em.merge nicht für das fehlen der Transaktion.