配置能够在Seam 3中@Inject EntityManager

在我的项目中,我使用Seam 3 ,我在使用@Inject注释注入EntityManager时遇到问题。 我很确定有某种配置可以确保EnityManager知道要使用哪个PersistenceUnit 。 例如,使用EJB您可以键入:

 @PersistenceContext(unitName="MY_PERSISTENCE_UNIT_NAME") private EntityManager eManager; 

persistence.xml文件中配置了哪个持久性单元。 这是我的伪配置:

    org.hibernate.ejb.HibernatePersistence java:jboss/TimeReportDS META-INF/orm.xml .... .... ....                   

我已经阅读了一些关于Seam 2的文章,但是配置是在components.xml文件中添加的:

  

标签内。 Seam 2的下一步是添加:

  

persistence.xml

    ...  ...     

但它接缝在Seam 3中没有文件components.xml 。 此外, unitName注释中没有属性unitName来指定持久性单元。

所以请帮我配置我的项目,这样我就可以使用@InjectEntityManager ,如网上的许多例子所示。

我使用Postgres数据库和JBoss AS 7

编辑:添加一个例子。 我不在Entity类中使用EntityManager

 @Named("validateReportAction") @SessionScoped public class ValidateReportAction extends ReportAction implements Serializable { private static final long serialVersionUID = -2456544897212149335L; @Inject private EntityManager em; ... } 

在这个@Inject我得到Eclipse警告“ No bean is eligible for injection to the injection point [JSR-299 §5.2.1]

如果我在一些标记为Entity的bean上使用@Inject ,那么@Inject工作正常。

您可以在CDI bean上使用@PersistenceContext。 它不一定是EJB。

如果由于某种原因你想使用@Inject,你必须做更多的工作。 @Inject不知道EntityManager; 它只能注入其他托管bean。 令人高兴的是,有一个简单的解决方法 – 使用一个充当简单蹦床的生产者方法。

 @ApplicationScoped public class EntityManagerProducer { @PersistenceContext private EntityManager entityManager; @Produces @RequestScoped public EntityManager getEntityManager { return entityManager; } public void closeEntityManager(@Disposes EntityManager em) { if (em != null && em.getTransaction().isActive()) { em.getTransaction().rollback(); } if (em != null && em.isOpen()) { em.close(); } } } 

您现在可以使用@Inject注入EntityManager。 注入的EntityManager将是RequestScoped,而EntityManagerProducer是ApplicationScoped。 此外,必须关闭entityManager。