Подтвердить что ты не робот

Приложение vs Container Managed EntityManager

В настоящее время у меня проблема с пониманием концепции JPA.

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

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

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

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

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

4b9b3361

Ответ 1

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

Вы вызываете:

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

то если вы добьетесь успеха, вы сможете позвонить

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

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

entityManager.getTransaction().rollBack();

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

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

Ответ 2

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

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

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

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

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