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!