我正在tomcat 7上使用Hibernate和Weld CDI运行一个项目。我编写了一个ServletContextListener来在应用程序启动期间创建EntityManagerFactory和EntityManager。
public class PersistenceListener implements ServletContextListener { private static EntityManagerFactory entityManagerFactory; public void contextInitialized(ServletContextEvent sce){ ServletContext context = sce.getServletContext(); entityManagerFactory = Persistence.createEntityManagerFactory("hibernate-test"); } public void contextDestroyed(ServletContextEvent sce) { entityManagerFactory.close(); } public static EntityManager createEntityManager() { if (entityManagerFactory == null) { throw new IllegalStateException("Context is not initialized yet."); } return entityManagerFactory.createEntityManager(); } }
我可以通过以下代码创建它,从而在我的测试类(这是一个Arquillian测试类)中使用我的entityManager
EntityManager em = PersistenceListener.createEntityManager(); em.getTransaction().begin(); em.createQuery("delete from Game").executeUpdate(); em.getTransaction().commit();
这是我的测试课的完整代码
@RunWith(Arquillian.class) public class HibernateTestSample { @Deployment public static WebArchive createTestArchive() { MavenDependencyResolver resolver = DependencyResolvers.use( MavenDependencyResolver.class).loadMetadataFromPom("pom.xml"); WebArchive webArchive= ShrinkWrap .create(WebArchive.class, "ROOT.war") .addClasses(CdiTestBean.class,HibernateListener.class,PersistenceListener.class) .addAsLibraries( resolver.artifact("org.jboss.weld.servlet:weld-servlet") // .artifact("org.hibernate.javax.persistence:hibernate-jpa-2.0-api") .artifact("org.apache.tomcat:tomcat-dbcp") .artifact("org.hibernate:hibernate-entitymanager") .artifact("org.hibernate:hibernate-validator") .artifact("org.hibernate:hibernate-core") .artifact("com.h2database:h2") .artifact("mysql:mysql-connector-java") .resolveAs(GenericArchive.class)) .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") .addAsWebInfResource("test-persistence.xml", "classes/META-INF/persistence.xml") .addAsWebInfResource("hibernate.cfg.xml", "classes/hibernate.cfg.xml") // .addAsWebInfResource("context.xml", "classes/META-INF/context.xml") .addAsManifestResource("context.xml", "context.xml") .setWebXML("hibernate-web.xml"); System.out.println(webArchive.toString(true)); return webArchive; } @Test public void myTest() throws Exception { EntityManager em = PersistenceListener.createEntityManager(); em.getTransaction().begin(); em.createQuery("delete from Game").executeUpdate(); em.getTransaction().commit(); ............... ....... ... } }
但我想将我的entityManager注入我的班级。我在另一篇文章中读到,我不能在类中使用@PersistenceContext,因此,我决定使用生产者来注入我的实体管理器。但这对我不起作用,请告诉我我在这里做错了什么(我在CDI中是很新的)
这是我的新ServletContextListener
public class PersistenceListener implements ServletContextListener { private static EntityManagerFactory entityManagerFactory; @Produces private EntityManager entityManager; public void contextInitialized(ServletContextEvent sce){ ServletContext context = sce.getServletContext(); entityManagerFactory = Persistence.createEntityManagerFactory("hibernate-test"); createEntityManager(); } public void contextDestroyed(ServletContextEvent sce) { entityManagerFactory.close(); } public void createEntityManager() { if (entityManagerFactory == null) { throw new IllegalStateException("Context is not initialized yet."); } this.entityManager = entityManagerFactory.createEntityManager(); }
我正在注入我的测试课
@Inject private EntityManager em;
它为空
您需要@Produces使用createEntityManager方法而不是字段。
@Produces
createEntityManager