2012-02-09 6 views
2

컨테이너 관리 트랜잭션을 한 클래스에서 사용하고 하위 클래스와 공유하려고합니다.JBoss - EntityManager 삽입 실패

이 아이의 상단에
@Stateless 
@TransactionManagement(TransactionManagementType.CONTAINER) 
public class OrdreDAO extends AbstractDAO { 
    public OrdreDAO() { 

    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void persist(Ordre o) { 
     em.persist(o);// NPE here ... no EntityManager injected ! 
    } 

    @SuppressWarnings("unchecked") 
    public List<Ordre> findAll() { 
     Query q = em.createQuery("from Ordre"); 
     return q.getResultList(); 
    } 
} 

, OrdreService :

public class OrdreService { 
    private OrdreDAO dao; 

    public OrdreService() { 
       dao=new OrdreDAO(); 
    } 

    public void persist(Ordre o) { 
     System.out.println("Service::persist ??"); 
     dao.persist(o); 
    } 

    public List<Ordre> getOrdres() { 
     return dao.findAll(); 
    } 

    public Ordre getOrdre(String id) { 
     return dao.findByPK(id); 
    } 

    public Ordre merge(Ordre o) { 
     return dao.merge(o); 
    } 
} 

를 사용하는 서블릿 : 자식의

@TransactionManagement(TransactionManagementType.CONTAINER) 
public abstract class AbstractDAO { 
    @PersistenceContext(unitName = "myDS") 
    protected EntityManager em; 

    @Resource 
    protected SessionContext context; 

    protected Logger log; 

    public AbstractDAO() { 
     log = LoggerFactory.getLogger(this.getClass()); 
    } 
} 

하나 : 여기

내 추상 클래스입니다

지속하려고 할 때 NPE가 발생합니다. Ordre 무엇이 누락 되었습니까?

JDK 6
보스 5.1.0.GA
JPA 1

+1

왜 @Stateless를 추상 클래스에 제공하겠습니까? 거기에서 제거하고 테스트 할 수 있습니다. –

+0

코드가 작동하지 않는 이유가 확실하지 않습니다. NetBeans는 EntityManager가 서브 클래스에 삽입된다는 점만 제외하면 정확히 같은 방식으로 서비스 facade 클래스를 생성합니다. 그리고 그것은 (적어도 GlassFish 3에서는) 작동합니다. http://netbeans.dzone.com/nb-generate-simpler-rest – perissf

+0

내 게시물을 내 일부 코드로 업데이트했습니다. – Stephan

답변

2

귀하의 OrdreServicePOJO 클래스는 웹 컨테이너에 의해 관리되지 않으며, 또한 그것의 나에게 보인다 쓸데없는 추가 레이어. 나는 OrdreDAO 만 사용합니다.

두 클래스를 모두 유지하려면 OrdreServiceStatelessEJB으로 설정하십시오. 사용 OrdreServiceOrdreDAO 인스턴스를 주입 :

@EJB private OrdreDAO dao; 

마지막으로 사용하여 서블릿에서 OrdreService 주입이 작동합니다

@EJB private OrdreService os; 

.