Currently, I\'m using PersistenceContext to inject an EntityManager. The EM is injected perfectly.
@Stateless
public StatelessSessionBean implements Stateles
@PersistenceContext is an EJB injection point, while @Inject is a CDI one
Actually, no. @PersistenceContext
annotation can be used in CDI and is not connected with EJB. You can do something like this:
@Named
public class EntityDAO {
@PersistenceContext
private EntityManager manager;
...
}
EJB uses @EJB
annotation to inject other EJB, but it can inject any CDI bean or persistence context with same annotations.
The best practice for persistence context and CDI is to make them CDI bean to avoid these kind of issue.
public class MyProducers {
@Produces
@PersistenceContext(unitName = "MyPersistenceUnit")
private EntityManager em;
}
After that you'll be able to inject the EntityManager
in CDI way. Taking your EJB it'll be :
@Stateless
public StatelessSessionBean implements StatelessSessionBeanLocal {
@Inject
private EntityManager em;
@Override
public Collection<MyObject> getAllObjects(){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriqQuery<MyObject> query = cb.createQuery(MyObject.class);
query.from(MyObject);
return em.createQuery(query).getResultList();
}
}
This way, you'll be able to decorate your CDI bean with no issue.
If you have multiple EntityManagers
you can use CDI qualifiers to distinguish them