Tomcat 7 で Hibernate と Weld CDI を使用してプロジェクトを実行しています。アプリケーションの起動時に EntityManagerFactory と EntityManager を作成するために ServletContextListener を作成しました。
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();
...............
.......
...
}
}
しかし、エンティティマネージャーをクラスに注入したいと考えています。クラスで @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;
ヌルです