我想在一个类中使用容器管理的事务,并与其子类共享它。

这是我的抽象课:

@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:

public class creerOrdre extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private OrdreService os;

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
            System.out.println("création ordre");
            Ordre o = new Ordre();
            o.setDate(req.getParameter("date"));
            o.setMotif(req.getParameter("motif"));

            System.out.println("Ordre: " + o.getDate() + " " + o.getMotif());

                            OrdreService os = new OrdreService()
            if (os!=null) {
                System.out.println("NON null !");
            }
            os.persist(o);

            resp.sendRedirect("visualiser.jsp");
        } catch (ParseException pe) {
            throw new ServletException(pe);
        }
    }
}


当我尝试保持Ordre时,我得到了NPE
我想念什么?

JDK 6
JBoss 5.1.0.GA
JPA 1

最佳答案

您的OrdreService POJO类不受Web容器的管理,在我看来,这也是一个无用的附加层。我只会使用OrdreDAO

无论如何,如果要保留两个类,请将OrdreService设置为Stateless EJB。使用以下命令在OrdreService实例中注入OrdreDAO

@EJB private OrdreDAO dao;


最后,使用以下命令将OrdreService注入到servlet中:

@EJB private OrdreService os;


这应该工作。

07-23 18:50