Я работаю над приложением J2EE
, которое будет развернуто на Weblogic
, оно содержит два слоя:
Я разделяю два уровня, чтобы иметь возможность повторно использовать бизнес-уровень (как jar-библиотеку) в проекте Java SE.
Я использую transaction-type = JTA
, чтобы позволить серверу управлять транзакциями, но в проекте SE я использую transaction-type = RESOURCE_LOCAL
, поэтому мне нужно явно начать и зафиксировать транзакцию.
Итак, вопрос: есть ли какие-либо проблемы, если я запускаю и фиксирую транзакцию явно при использовании JTA
?
Другими словами, есть ли огромные различия между двумя приведенными ниже кодами:
public void create(T entity) {
entityManager.persist(entity);
}
а также
public void create(T entity) {
entityManager.getTransaction().begin();
entityManager.persist(entity);
entityManager.getTransaction().commit();
}
Вы просто должны быть более осторожными при работе с транзакциями вручную. Всегда имейте подстраховку на случай исключения, чтобы откатить свои операции:
try {
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
try {
entityManager.persist(entity);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
throw e; // optional if you want to manage the exception higher up
} finally {
entityManager.close(); // optional if you also manage you EM creation manually.
}
ваши транзакции будут иметь те же реквизиты конфигурации, что и CMT. Вам просто нужно управлять исключениями начала/конца/обработки.
спасибо за ваш ответ, так что это не вызовет негативных последствий потери некоторых преимуществ при использовании
transaction-type = JTA