2013-04-05 2 views
2

Просто уточнение на моем понимании того, как транзакции, управляемый контейнером (CMTS) работает в JPA -транзакция, управляемый контейнером

CMTS пощадить приложение усилие начала и совершения сделок явно не так ли?

CMT могут ТОЛЬКО применяться к сеансу и бобам, управляемым мессажем, и НЕ ПОЖО?

Мое обоснование для вышеуказанных вопросов - я хотел бы знать, как получить доступ к объекту из приложения java-se, а также к java-ee. Нужно ли мне две отдельные единицы постоянной?

ответ

4

Я позволяю себе полностью переписать свой ответ, потому что это было не совсем ясно и хуже, некоторые вещи были просто ошибками.

Дело в том, что вы (и я) смешиваете термины EJB и JPA.
JPA говорит только об объектных компонентах. Компоненты сеанса (включая CMT и BMT) являются частью спецификации EJB.
В JPA мы поговорим о диспетчере сущностей, управляемых контейнером и управляемых приложениями, связанных с JTA или узлом локализации ресурсов.

Вот соответствующая часть спецификации JPA:

Контейнер управляемого менеджер объект должен быть менеджером JTA лицом. Менеджеры сущностей JTA указаны только для использования в контейнерах Java EE. Управляющий объект управления приложениями может быть либо менеджером сущности JTA, либо менеджером локального ресурса .

[...]

И JTA менеджеры сущностей и ресурсосберегающие местные менеджеры сущностей должны поддерживаться в Java EE веб-контейнеров и контейнеров EJB. В среде EJB обычно используется менеджер объектов JTA. В целом, в средах Java SE поддерживаются только ресурсы-локальные администраторы сущностей.

[...]

менеджером Субъект, операции контролируются через ССТ является менеджером объект JTA. ЕТ менеджера юридического лица участвует в текущей транзакции JTA, которая началась и совершенной внешними по отношению к менеджеру сущности и распространяющейся к базовому ресурсу manager.`

[...]

When используется диспетчер сущности, управляемый контейнером, жизненный цикл контекста постоянства всегда управляется автоматически, прозрачно для приложения, а контекст персистентности распространяется на . Операция JTA

Таким образом, вам нужно будет определить 2 единицы измерения продолжительности, только если вы хотите использовать диспетчер объектов JTA (управляемый по погоде или не управляемый контейнером) в приложении Java EE.

+0

Как сессионный компонент не может быть частью единицы сохранения? И что вы на самом деле имеете в виду? Только сущности beans являются частью единицы персистентности, не так ли? – bennidi

+0

Также: тип транзакции RESOURCE_LOCAL/JTA отличается от CMT/BMT – bennidi

+1

права, я смешал оба, поскольку я никогда не использовал ejb в одиночку, для меня JTA datasource и CMT собрались вместе, но, похоже, это не так cf. http://stackoverflow.com/questions/3217586/difference-between-a-jta-datasource-and-a-resource-local-datasource – Gab

1

CMT определяется декларативно с использованием аннотаций, которые оцениваются контейнером Java EE, которые затем обеспечивают прозрачную обработку транзакций. Pojos не управляется контейнером, поэтому CMT не может применяться.

Что касается вашего вопроса об объектах. Вы должны создать слой DAO, чтобы абстрагировать технические детали вашей логики персистентности. вы можете использовать одну общую реализацию dao для поддержки JPA. Это в основном единственная часть, которая должна быть разной для двух сред. В контейнере вы получите свои транзакции бесплатно, как указано в аннотации. Если вы работаете в стандартном java se, вы должны начинать/совершать/откатывать свои транзакции самостоятельно.

Я предлагаю вам создать общую реализацию dao, которая декларирует транзакции декларативно и ожидает выполнения внутри контейнера. Для использования в java se у вас есть декоратор для этого dao, который заботится о правильной обработке транзакций, чтобы подражать тому, что на самом деле сделал бы контейнер.

Я думаю, что вы на самом деле не нужно ничего менять в persistence.xml, но, может быть, я не прав здесь

Смежные вопросы