Ein JTA-EntityManager kann getTransaction () nicht verwenden

Wie kann ich den folgenden Code in meiner Nicht-EJB-Anwendung verwenden? Der Code funktioniert.

@Override
public void saveItems(Collection<T> items) {
    synchronized (em) {
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            for (T item : items) {
                saveItem_((Class<T>) null, item);
            }
            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
        }
    }
}

In einer neuen Anwendung verwende ich EJB3 + JSF und möchte die Bibliothek mit dem obigen Code wiederverwenden. Meine Peristence Unit für die neue Anwendung sieht folgendermaßen aus:

  <persistence-unit name="myApp" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>MySQLConnection</jta-data-source>
  </persistence-unit>

Meine neue Anwendung löst eine Ausnahme aus, wenn sie diese Zeile erreicht:

    EntityTransaction tx = em.getTransaction();

die ausnahme ist:

A JTA EntityManager cannot use getTransaction()

Welches ist klar genug. Die Frage ist, wie ich meinen Code konvertieren würde, damit die Transaktionen vom Container verwaltet werden. Vermutlich müssen meine Bean-Methoden entsprechend kommentiert werden ... Die Frage ist, wie?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage