2009-12-27 4 views
2

EntityManager을 사용하는 경우 PersistenceContext으로 인스턴스 하나를 얻고 내 프로그램에서 전달하는 것이 더 좋습니까? 아니면 종속성 삽입을 두 번 이상 사용해야합니까?EntityManager 초기화 모범 사례

내 응용 프로그램에서 각 클라이언트는 stateful 세션 빈과 통신 할 것이며 각 빈은 어느 시점에서 EntityManager을 사용해야합니다. 나는 콩 메소드가 동시에 호출된다고 생각한다. EntityManager을 스레드로부터 안전하게 사용하도록 어떻게 보장합니까? 거래가 있습니까? 각 빈에 별도의 인스턴스가 있습니까?

죄송합니다. 혼란 스럽다면 EJB/JPA를 처음 사용하고 제 질문에 대한 자료를 찾을 수 없었습니다.

답변

2

예, 각각의 스레드/클라이언트 요청마다 달라질 EntityManager 인스턴스를 상태 저장 세션 빈에 삽입해야한다. 적어도 다른 클라이언트가 아닌) 동시에 호출되지 않습니다.

DAO 클래스를 만드는 데는 아무런 의미가 없습니다. JPA는 이미 다른 JPA 구현간에 RDBMS 독립성과 이식성을 제공하는 높은 수준의 지속성 API입니다. 따라서 DAO는 코드베이스에 혼란을 더할뿐입니다.

거래의 경우 실제로는 아무 것도 할 필요가 없습니다. 세션 빈의 비즈니스 메소드는 기본적으로 "필수"트랜잭션 속성을 가지므로 항상 클라이언트 특정 트랜잭션 내에서 실행됩니다.

+0

답변 해 주셔서 감사합니다. 따라서 내 스테디ful bean은'EntityManager' 속성을 가져야하고 매개 변수를 통해 DB에 액세스하는 다른 객체에 전달해야합니다. –

+1

예, 필요한 경우. 그러나 EJB를 사용할 때는 Session Bean 자체 (Stateless 또는 Stateful)에서 EntityManager API에 액세스하는 것이 가장 좋습니다. EntityManager 인스턴스를 전달할 필요가 없다. 물론 다른 종류의 관리 빈 (MDB와 같은)도 동일한 기능을 수행 할 수 있습니다. –

3

@PersistenceContext을 사용하여 EntityManager을 (를) DAO 수업에 삽입하십시오. 이들은 데이터베이스 조작을 처리 할 클래스입니다. 그런 다음 다른 모든 (서비스) 클래스에서 DAO 클래스를 주입하십시오. 당신의 DAO는 상태없는 빈이어야한다. (원격 인터페이스가 필요없고 지역적이어야한다.)

+0

답장을 보내 주셔서 감사합니다. 왜 DAO는 상태없는 빈이어야합니까? –

+0

상태가 필요하지 않습니다. 무엇에 저장해야합니까? – Bozho