J'ai donc une application avec des appels JDBC hérités que j'ai besoin de mettre à jour avec des actions JPA supplémentaires. Je dois pouvoir faire des appels JDBC et des appels JPA dans le cadre de la même transaction DB. J'utilise OpenJPA 2.1.1 et Postgres 9.1, si c'est important. Le code suivant semble fonctionner correctement: j'ai exécuté des tests de base et les instructions JDBC et JPA s'exécutent; une erreur dans l'une ou l'autre entraîne la non-réalisation de la paire d'instructions (par exemple, elles font partie de la même transaction DB). Y a-t-il des problèmes avec ce que je ne vois pas - une bonne pratique que je viole, ou une autre raison pour laquelle je ne peux pas réutiliser l'objet Connection de cette manière?Combinaison des actions JPA et JDBC dans une transaction
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();
}
}
Merci!
tant qu'ils partagent tous les deux le même objet de connexion (ce que je crois que vous faites en regardant le code), ils peuvent faire partie de la même transaction. Pourquoi ne le vérifie-t-on pas en écrivant un test simple au lieu de poster une question? –
Je vais éditer ma question de manière appropriée - cela semble être entièrement fonctionnel (je l'ai testé avec du code réel, et il semble fonctionner correctement). Je suis nouveau dans les bases de données JPA/JDBC/en général, et je crains qu'il y ait un problème subtil dont je ne suis pas conscient et qui n'apparaisse pas dans mes cas de test simples. – Sbodd