#jpa #jdbc #jboss7.x #ejb-3.0 #java-ee-6
Вопрос:
У меня есть устаревшее приложение Jboss, которое использует много чистого кода JDBC с программно управляемыми транзакциями, которые выглядят следующим образом:
DataSource ds = (DataSource) InitialContext.doLookup(name); Connection con = ds.getConnection(); con.setAutoCommit(false); PreparedStatement stmt1 = con.prepareStatement(...); PreparedStatement stmt2 = con.prepareStatement(...); try{ stmt1.execute(); stmt2.execute(); }catch(Exception){ connection.rollback(); } connection.commit();
Теперь я хочу ввести код на основе CMT/EntityManager. Я могу создать на стороне DAO с EntityManager, полученным с помощью @PersistenceContext, и перенести ссылку на него в код выше такого кода между попыткой/уловом, чтобы стать следующим:
try{ stmt1.execute(); MyEntity entity = new MyEntity(); myDAO.persist(entity); stmt2.execute(); }catch(Exception){ connection.rollback(); } connection.commit();
но проблема здесь в том, что код myDAO.persist(entity);
будет выполняться в отдельной транзакции, и в случае stmt2.execute()
сбоя сохраненный экземпляр MyEntity не может быть откатан. Провести рефакторинг всего устаревшего кода, чтобы сделать его основанным на CMT, невозможно, так как это огромный объем кода. Если кто-то решил такую проблему, будет очень признателен за совет, как я могу объединить эти два подхода для работы в одной транзакции?