Kombinieren von JPA- und JDBC-Aktionen in einer Transaktion

Ich habe also eine Anwendung mit einigen älteren JDBC-Aufrufen, die ich mit einigen zusätzlichen JPA-Aktionen aktualisieren muss. Ich muss in der Lage sein, sowohl JDBC-Aufrufe als auch JPA-Aufrufe als Teil derselben DB-Transaktion durchzuführen. Ich verwende OpenJPA 2.1.1 und Postgres 9.1, wenn es darauf ankommt. Der folgende Code scheint korrekt zu funktionieren. Ich habe einige grundlegende Tests ausgeführt und sowohl die JDBC- als auch die JPA-Anweisung ausgeführt. Ein Fehler in einem der beiden führt dazu, dass das Anweisungspaar nicht auftritt (z. B. sind sie Teil derselben DB-Transaktion). Gibt es irgendwelche Probleme, die ich nicht sehe - eine bewährte Methode, gegen die ich verstoße, oder einen anderen Grund, warum ich das Connection-Objekt nicht auf diese Weise wiederverwenden kann?

EntityManager em = _em; //acquired from OpenJPA
em.getTransaction().begin();
Connection conn;
try {
  OpenJPAEntityManager oem = (OpenJPAEntityManager) em.getDelegate();
  conn = oem.getConnection();
  PreparedStatement ps = conn.prepareStatement(myStatement);
  //initialize parameters in ps
  ps.executeUpdate();
  em.merge(myJpaObject);
  em.getTransaction().commit();
} finally {
    if (ps != null && !ps.isClosed()) {
      ps.close();
    }
    if (em.getTransaction().isActive()) {
    em.getTransaction().rollback();
  }
}

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage