Вы явно отмечаете свои транзакции с помощью em.getTransaction (). Begin () и commit ()? Если это так, Hibernate делегирует управление транзакциями драйверу JDBC, и это можно настроить с другими свойствами (как на уровне драйвера, так и на уровне Hibernate, например, на уровнях изоляции).
Если вы затем решите использовать сервер приложений, вы можете просто установить для свойства hibernate.transaction.factory_class значение org.hibernate.transaction.JTATransactionFactory, и Hibernate присоединится / создаст транзакцию на основе ваших инструкций (em.getTransaction () .begin () / commit ()).
JTA особенно полезен, если у вас есть два или более компонента с поддержкой транзакций, так как JTA управляет событиями и заказами фиксирует / откатывает в зависимости от общего результата. Например, если у вас есть одна транзакция EJB, которая что-то сохраняет в базе данных и отправляет электронное письмо, оба действия могут быть внутри транзакции, и ее можно откатить в случае сбоя любого из них. Но если вас интересуют только транзакции с базой данных, вам не нужен JTA.
И чтобы ответить на ваш последний вопрос: если вам нужен JTA, но вы не хотите использовать сервер приложений EE, вы можете найти автономных JTA-провайдеров, таких как JOTM. Но будьте осторожны: если вы обнаружите, что добавляете несколько «автономных» провайдеров для различных услуг, у вас может получиться «домашний EE-сервер», что не очень хорошо; -)