2011-12-08 2 views
18

현재 JPA의 개념을 이해하는 데 문제가 있습니다.Application 대 ​​Container Managed EntityManager

현재 프로젝트를 시연하기 위해 최근의 EclipseLink, Glassfish, Derby 데이터베이스를 사용하고 있습니다.

훨씬 더 큰 그림으로 무언가를 개발하기 전에이 PersistingUnit이 다른 범위의 관점에서 어떻게 작동하는지 절대적으로 확신해야합니다.

나는 서블릿 3.0을 가지고 있으며 현재 request.session 객체 (동일한 war 파일에있는 모든 것)에 사용자의 연관된 엔티티 클래스를 저장하고있다. 현재 EntityManagerFactory 및 UserTransaction 주입을 사용하여 응용 프로그램 관리 EntityManager를 사용하고 있습니다. 혼자서 테스트 할 때 부드럽게 작동합니다. 서로 다른 버전의 엔티티는 2 명의 사용자가 동시에 동일한 엔티티에 액세스 할 때 발생합니다. 가능하다면 동일한 WAR, 동일한 지속성 단위를 거친 관리 빈들과 함께 작업하고 싶습니다.

나는 http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html을 읽고 나에게 의미가없는 범위에 대한 설명을 많이 읽었습니다.

짧은 이야기 짧은 이야기와 앱 및 컨테이너 관리 EntityManagers의 차이점은 무엇입니까?

답변

17

애플리케이션 관리 트랜잭션은 트랜잭션을 처리 할 코드를 의미합니다. 간단히 말해서 그것은 의미 :

당신은 전화 : 당신이

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

또는 실패의 경우에 당신이 할 것입니다 전화를 보장합니다 성공하면

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

후 확인 전화 :

entityManager.getTransaction().rollBack(); 

이제 컨테이너를 가지고 있는데, 언제 begin(), commit() 또는 rollback(), 컨테이너 관리 트랜잭션입니다. 귀하를 대신하여 거래를 담당하는 사람.

그냥 지정해야합니다.

+0

당신은 "당신이 콘테이너를 가지고 있다고 상상해보십시오, 콘테이너를 관리하고있는 트랜잭션을 커밋하거나 롤백 할 때를 알고 있습니다. 누군가를 대신하여 트랜잭션을 처리합니다." –

+0

컨테이너는 Spring과 유사합니다. bean을 구성 할 때 엔티티 bean을 구성하는 것과 같은 tansaction 엔티티를 지정하고 Bean을 @Transactional로 지정하고 트랜잭션이 Spring에 의해 처리되도록 지정합니다. – mprabhat

+3

무엇을 반영하는 질문을 발견 했습니까? 나는 "애플 리케이션과 컨테이너 관리 EntityManagers의 사용법과 차이점"을 찾고 있었는데, 단지 받아 들인 응답이 뭔가 다른 것 (컨테이너 대 애플 리케이션이 _transactions_를 처리했다는 것을 알아내는 것)을 찾고 있었다. 그 대답은 OP가 말하지 않은 "애플리케이션 관리 트랜잭션을 말할 때"로 시작합니다. – alterfox

11

컨테이너 관리 트랜잭션 (CMT)은 일종의 선언적 트랜잭션으로 간주 될 수 있습니다.이 경우 트랜잭션 관리는 컨테이너 (일반적으로 EJB 컨테이너)에 위임되며 많은 개발 작업이 단순화 될 수 있습니다.

EJB 컨테이너가있는 Java EE 환경에있는 경우 CMT를 직접 사용할 수 있습니다.

우리가 Java SE 환경이나 EJB 컨테이너가없는 Java EE 환경에있는 경우에도 CMT를 활용할 수 있습니다. AOP를 사용하여 선언적 트랜잭션 관리를 구현하는 Spring을 사용하는 방법이 있습니다. 또 다른 방법은 Guice를 사용하는 것입니다. Guice는 PersistFilter를 사용하여 선언적 트랜잭션을 구현합니다.

CMT에서 컨테이너 (EJB 컨테이너, Spring 또는 Guice가 무엇이든)는 트랜잭션 전파 및 커밋/롤백 작업을 처리합니다.

AMT (응용 프로그램 관리 트랜잭션)는 코드에서 프로그래밍 방식으로 트랜잭션을 처리해야한다는 점에서 CMT와 다릅니다.

+4

좋은 답변이지만 모든 공식 Java EE 환경에는 항상 EJB 컨테이너가 있다는 것을 잊지 마십시오. 그렇지 않으면 Java EE라고 할 수 없습니다 (따라서 Tomcat은 공식 Java EE 환경이 아닙니다). 또한 Java EE에서는 CMT의 반대를 BMT라고합니다. 빈 관리 트랜잭션. –

+0

답장을 보내 주셔서 감사합니다. – aqingsao