Seam 2 : Component.getInstance("entityManagerFactory") null
guinotphil Dec 8, 2011 6:24 AMHello,
A few months ago I did the migration of a Seam 2 / Hibernate 3 application from JBoss AS 7 to JBoss AS 7.
This is linked to the issue I had before (cf. http://community.jboss.org/thread/171111 ), but it’s a different problem which I only notice now.
I won’t describe all the details of what I did, but here is some information.
a) My Hibernate 3 persistence objects are all in a jar project which is deployed in the lib/ directory of the EAR. In persistence.xml my unit name is defined by
<persistence-unit name="entityManagerFactory" transaction-type="JTA">
And I did the following changes (mainly JNDI names):
<jta-data-source>java:/MyDS</jta-data-source>
to
<jta-data-source>java:jboss/datasources/MyDS</jta-data-source>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/MyEntityManagerFactory" />
to
<property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/MyEntityManagerFactory" />
And removing
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider"/>
b) My WAR module has a components.xml file in which I made the following changes:
Use of a JPA2 Persistence Provider
<!-- http://ctpjava.blogspot.com/2010/07/using-seam-2-with-jpa-2.html -->
<component name="org.jboss.seam.persistence.persistenceProvider" class="mypackage.HibernateJpa2PersistenceProvider"/>
Fixing JNDI issues:
Changing
<core:init jndi-pattern="My_EAR_Project/#{ejbName}/local" debug="false" />
to
<core:init debug="false" />
Add
<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
<!-- component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/ -->
As well as @JndiName annotations on EJB beans.
And for the entity manager
<persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{entityManagerFactory}" persistence-unit-jndi-name="java:/MyEntityManagerFactory" />
becomes
<persistence:managed-persistence-context name="entityManager" auto-create="true" persistence-unit-jndi-name="java:jboss/MyEntityManagerFactory" />
As you can see, I removed the entity-manager-factory attribute because I actually had to remove this part of the components.xml:
<persistence:entity-manager-factory name="entityManagerFactory" persistence-unit-name="entityManagerFactory" startupDepends="ehCacheManager"/>
This is because, in AS 7 the entityManagerFactory is automatically created at start up, and this would try to create another one and fails :
Could not instantiate Seam component: entityManagerFactory
at org.jboss.seam.Component.newInstance(Component.java:2170) [jboss-seam.jar:]
at org.jboss.seam.contexts.Contexts.startup(Contexts.java:304) [jboss-seam.jar:]
at org.jboss.seam.contexts.Contexts.startup(Contexts.java:278) [jboss-seam.jar:]
at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:143) [jboss-seam.jar:]
at org.jboss.seam.init.Initialization.init(Initialization.java:744) [jboss-seam.jar:]
at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36) [jboss-seam.jar:]
at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.4.Final.jar:]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.4.Final.jar:]
at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:77) [jboss-as-web-7.1.0.CR1-SNAPSHOT.jar:]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [:1.6.0_27]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [:1.6.0_27]
at java.lang.Thread.run(Thread.java:662) [:1.6.0_27]
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: entityManagerFactory] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914) [hibernate-entitymanager-3.6.6.Final.jar:]
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890) [hibernate-entitymanager-3.6.6.Final.jar:]
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) [hibernate-entitymanager-3.6.6.Final.jar:]
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) [hibernate-jpa-2.0-api-1.0.1.Final.jar:]
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) [hibernate-jpa-2.0-api-1.0.1.Final.jar:]
at org.jboss.seam.persistence.EntityManagerFactory.createEntityManagerFactory(EntityManagerFactory.java:81) [jboss-seam.jar:]
at org.jboss.seam.persistence.EntityManagerFactory.startup(EntityManagerFactory.java:50) [jboss-seam.jar:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_27]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_27]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_27]
at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_27]
at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) [jboss-seam.jar:]
at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) [jboss-seam.jar:]
at org.jboss.seam.Component.callComponentMethod(Component.java:2283) [jboss-seam.jar:]
at org.jboss.seam.Component.callCreateMethod(Component.java:2198) [jboss-seam.jar:]
at org.jboss.seam.Component.newInstance(Component.java:2158) [jboss-seam.jar:]
... 13 more
Caused by: org.hibernate.MappingException: Cannot cache an unknown entity: mymodel.MyObject
at org.hibernate.cfg.Configuration.applyCacheConcurrencyStrategy(Configuration.java:2203) [hibernate-core-3.6.6.Final.jar:]
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1341) [hibernate-core-3.6.6.Final.jar:]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724) [hibernate-core-3.6.6.Final.jar:]
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76) [hibernate-entitymanager-3.6.6.Final.jar:]
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905) [hibernate-entitymanager-3.6.6.Final.jar:]
... 28 more
I'm not really sure about the reason why it fails, I think this is because my model and the persistence.xml are in a different jar, but the main thing is that it try to creates a new Entity Manager Factory which is not what I want.
With this setting, I can get the EntityManager via Seam:
Component.getInstance("entityManager"); => mypackage.Jpa2EntityManagerProxy@38f87c0d
But - and this is my problem - I can no longer get the EntityManagerFactory :
Component.getInstance("entityManagerFactory") => null
Is there any way to configure Seam so it can get the entityManagerFactory from JNDI instead of try to create a new one ?
Thank you very much for any help !