2011-01-26 2 views
0

일부 도우미 클래스에서 엔티티 관리자를 주입하려고하는데 세션 빈에서 도우미에게 전달할 수 있지만 문제는 정적 초기화에서 엔티티 관리자를 사용해야합니다. 헬퍼 클래스 (와 같은 어떤 것)의 블록 :EJB 도우미 클래스에서 엔티티 관리자를 조회 중

class MySessionBeanHelperClass 
{ 
// staff here... 


    static 
{ 
    SomeClass s = new SomeClass(entityManager); 
} 
} 

그래서, 나는 유일한 방법은 그것을 주입 대신 엔티티 관리자를 조회하는 것입니다 생각합니다. 전달 된 SessionContent를 사용하면 여기에서 작동하지 않습니다.

두 번째 질문은 다음과 같습니다. 리소스 (이 경우 엔티티 관리자)를 조회하는 데 일반적인 방법을 사용하면 (다음과 같은 :)

Context ic = new InitialContext(); 
em = (EntityManager) ic.lookup("java:comp/env/persistence/em"); 

이 엔티티 관리자가 사용하는 모든 트랜잭션을 Bean 관리 트랜잭션으로 변환합니까 ??

감사합니다.

답변

1

정적 이니셜 라이저에서 그렇게하는 것이 좋지 않다고 생각합니다. 조회가 일어나기 전에 필요한 모든 서비스 (예 : JNDI, JPA)가 가동되었는지 확인해야하지만 정적 초기화 프로그램에서 수행 할 때이를 보장 할 수는 없습니다.

EJB에서 알려진 문제는 응용 프로그램에서 일회성 작업을 수행하는 "표준"방법이 없다는 것입니다. 시작/중지,하지만 당신은 다음 링크에서 트릭을 사용할 수 있습니다

How to perform a DB cleanup operation upon shutdown in an EJB container

예는 응용 프로그램에 따라 작업을 수행하기위한 것입니다. 정지하지만 대신 Servlet#init을 무시할 수 있습니다.

+1

'EJB에서 알려진 문제는 앱에서 일회성 작업을 수행하는 "표준"방법이 없다는 것입니다. 이는 사실이 아닙니다. @Singleton과 @Startup을 결합하면 EJB 3.1에서 정확히 수행됩니다. TS가 EJB 3.0을 사용하고 있음을 나타내므로이 옵션은 불행히도 옵션이 아닙니다. –

+0

@arjan : 오, 그래서 그들은 3.1에서 그것을 고쳤습니까? 좋은! –

+0

네 말이 맞아, 나쁜 디자인 인 것 같았다! –

1

두 번째 질문에 대한 대답 아니요.

첫 번째 질문은 실제로는별로 좋은 생각이 아닙니다. 뭐라 구요? 헬퍼 클래스에 EntityManager이 필요한 경우에는 개인 인스턴스 수준 변수로 만들고 헬퍼 클래스 생성자를 사용하여 세션 빈에서 전달하는 것이 좋습니다.

+0

감사합니다 :) 저는 클라이언트로부터 요청이 올 때마다 create instance 대신에 일부 클래스 (non-ejb)에서 정적 인스턴스를 만들고 싶었습니다. –

+0

@Mohammed :'EntityManager'는 EJB가 아닙니다. 이해가 정확합니다. 그러나 여전히 관리 대상이며 컨테이너가 인스턴스를 생성할지 여부와 인스턴스를 인스턴스화 할시기를 알 수 없습니다. 우리가 그것을 주입 할 때 단순히 조회의 대안을 의미합니다. 그래서, 제 제안은 잘 작동합니다. –

관련 문제