Насколько я знаю (по крайней мере, так обстоит дело с Hibernate), вы не можете использовать JPA вне транзакции, поскольку жизненный цикл менеджера сущностей связан с жизненным циклом транзакции. Таким образом, фактический метод, который выполняет запрос, должен быть транзакционным.
Однако вы можете установить его на TransactionAttributeType.REQUIRES_NEW
; это приостановит любую существующую транзакцию, запустит новую и остановит ее, когда метод вернется. Это означает, что все ваши сущности будут отсоединены к тому времени, когда они достигнут вызывающего абонента, что, как кажется, вы пытаетесь достичь.
В более сложных системах полезно полностью отделить ваш уровень данных от бизнес-уровня и создать новый набор объектов. Затем ваш метод вызовет запрос JPA, затем использует возвращенные сущности для заполнения объектов вашего бизнес-уровня и возвращает их. Таким образом, вызывающая сторона никогда не сможет заполучить реальные сущности JPA, и вы сможете делать на своем уровне данных то, что вам нужно, поскольку теперь это всего лишь детали реализации. (Черт, вы могли бы изменить вызов базы данных на удаленный вызов API, и вызывающий абонент не должен был бы знать.)