2012-02-09 99 views
2

我想在一個類中使用容器管理的事務並將其與其子類共享。JBoss - EntityManager注入失敗

這裏是我的抽象類:

@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()); 
    } 
} 

它的一個子集:

@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); 
    } 
} 

使用它一個servlet:

當我試圖堅持一個 我得到一個NPE我錯過了什麼?

JDK 6
JBoss的5.1.0.GA
JPA 1

+1

爲什麼你會給一個抽象類的@Stateless?你可以從那裏刪除它並測試 – 2012-02-09 03:38:30

+0

我不確定你的代碼不工作的原因。我可以告訴你的是,NetBeans完全像你一樣生成服務外觀類,唯一的區別是EntityManager被注入到子類中。它起作用(至少在GlassFish 3上)。 http://netbeans.dzone.com/nb-generate-simpler-rest – perissf 2012-02-09 10:25:40

+0

我用我的一些代碼更新了我的帖子 – Stephan 2012-02-09 10:55:14

回答

2

OrdreServicePOJO類不是由Web容器管理,並且還我看來,這是一個無用的附加層。我只會使用OrdreDAO

無論如何,如果你想保持這兩個類,使OrdreService a StatelessEJB。使用OrdreService注入OrdreDAO實例:

@EJB private OrdreDAO dao; 

最後,使用注射在servlet OrdreService

@EJB private OrdreService os; 

這應該工作。