我想在一个类中使用容器管理的事务并与其子类共享它。
这是我的抽象类:
@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());
}
}
它的一个 child :
@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
中注入(inject) OrdreDAO
实例:
@EJB private OrdreDAO dao;
最后,使用以下方法在您的 servlet 中注入(inject) OrdreService
:
@EJB private OrdreService os;
这应该有效。
关于java - JBoss - EntityManager 注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204761/