Приложение vs Контейнер Управляемый EntityManager - PullRequest
19 голосов
/ 08 декабря 2011

У меня сейчас проблема с пониманием концепции JPA.

В настоящее время я использую / разрабатываю последнюю базу данных EclipseLink, Glassfish, Derby для демонстрации проекта.

Прежде чем разрабатывать что-то в гораздо большей картине, я должен быть абсолютно уверен в том, как этот PersistingUnit работает с точки зрения разных областей.

У меня есть набор сервлетов 3.0, и в настоящее время я сохраняю связанные с ними классы сущностей пользователя в объекте request.session (все в одном и том же файле войны). В настоящее время я использую EntityManager, управляемый приложением, используя EntityManagerFactory и инъекцию UserTransaction. Это работает гладко, когда это проверено мной. Различные версии сущностей возникают, когда 2 человека одновременно обращаются к одним и тем же сущностям. Я хочу работать с управляемыми bean-компонентами, которые пересекают одну и ту же WAR, одну и ту же единицу сохранения, если это возможно.

Я прочитал http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html и кучу объяснений тех областей, которые для меня вообще не имеют смысла.

Короче говоря , каковы особенности использования EntityManagers, управляемых приложениями и контейнерами?

Ответы [ 2 ]

19 голосов
/ 08 декабря 2011

Когда вы говорите, что транзакция, управляемая приложением, означает ваш код, который должен обрабатывать транзакцию. В двух словах это означает:

Звоните:

entityManager.getTransaction().begin(); //to start a transaction

тогда при успехе вы обязательно позвоните

entityManager.getTranasaction().commit(); //to commit changes to database

или в случае сбоя обязательно позвоните:

entityManager.getTransaction().rollBack();

Теперь представьте, что у вас есть контейнер, который знает, когда вызывать begin(), commit() или rollback(), то есть транзакцию, управляемую контейнером. Кто-то, кто заботится о транзакции от вашего имени.

Вам просто нужно указать это.

11 голосов
/ 16 февраля 2013

Управляемая контейнером транзакция (CMT) может рассматриваться как своего рода декларативная транзакция, и в этом случае управление транзакциями делегируется контейнеру (обычно это EJB-контейнер), и большая часть работы по разработке может быть упрощена.

Еслимы находимся в среде Java EE с контейнером EJB, мы могли бы использовать CMT напрямую.

Если мы находимся в среде Java SE или в среде Java EE без контейнера EJB, мы все равно можем воспользоваться преимуществами CMTодним из способов является использование Spring, который использует AOP для реализации декларативного управления транзакциями;Другой способ - использовать Guice, который использует PersistFilter для реализации декларативной транзакции.

В CMT контейнер (независимо от контейнера EJB, Spring или Guice) позаботится о распространении транзакции и фиксации / откате;

Управляемая приложением транзакция (AMT) отличается от CMT тем, что нам необходимо обрабатывать транзакции программно в нашем коде.

...