Да, код, который вы показываете, является ошибочным с точки зрения JTA.
Вы должны сообщить EM, что хотите, чтобы он был частью распределенной транзакции, вызвав em.joinTransaction ().Если вы не вызовете этот метод, пользовательская транзакция и транзакция EM будут отключены.Javadocs этого метода состояния:
Укажите EntityManager, что транзакция JTA активна.
Вы также можете видеть, что EM не нужно запускатьтранзакция, когда вы вызываете em.joinTransaction.Если вы не были в среде JTA, вам нужно было бы вызвать em.getTransaction (). Begin () и em.getTransaction.commit (), но, поскольку вы находитесь в транзакции JTA, UserTransaction отвечает за запуск, коммит или откат.
По поводу второго вопроса, нет проблем с кодом, который у вас там, как будто есть исключение, вы вообще не вызываете EM. НО если возникла исключительная ситуация, единственный метод, который вы можете (и должен) вызывать, это em.close ().Если вы попытаетесь сделать что-то еще, например, вызвать em.find (), EM выдаст исключение InvalidStateException.
Надеюсь, то, что я написал, понятно ... JTA - сложный монстр.