Entity Manager Woes
msduk Dec 14, 2006 9:20 AMOk I have oficially downgraded myslef to n00b after a large amount of previous success with seam.
Basically I am trying to use the entity manager from an external thread. I have the entity manager.
EntityManager em = null; try { jndi = new InitialContext(); //TODO get name from settings EntityManagerFactory emf = (EntityManagerFactory) jndi.lookup("java:/myEntityManagerFactory"); em = emf.createEntityManager(); NrgOrder nrgOrder = em.find(NrgOrder.class, 1); nrgOrder.setState(NrgOrder.SEND_ERR); em.persist(nrgOrder); log.debug(nrgOrder.getState()); em.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { if(jndi!=null) jndi.close(); } catch (NamingException e) { e.printStackTrace(); } }
the myEntityManagerFactory is the same one as seam references (I think) as defined by the following...
<persistence> <persistence-unit name="nrg2"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/myDatasource</jta-data-source> <properties> <!-- <property name="hibernate.hbm2ddl.auto" value="create"/> --> <property name="hibernate.cache.use_query_cache" value="true"/> <property name="hibernate.show_sql" value="true"/> <property name="jboss.entity.manager.factory.jndi.name" value="java:/myEntityManagerFactory"/> <property name="jboss.entity.manager.jndi.name" value="java:/entityManager"/> </properties> </persistence-unit> </persistence> and... <?xml version="1.0" encoding="utf-8"?> <components> <component name="org.jboss.seam.core.init"> <property name="debug">true</property> <property name="myFacesLifecycleBug">true</property> <property name="jndiPattern">my/#{ejbName}/local</property> </component> <component name="entityManager" class="org.jboss.seam.core.ManagedPersistenceContext"> <property name="persistenceUnitJndiName">java:/myEntityManagerFactory</property> </component> <component name="org.jboss.seam.core.manager"> <property name="conversationTimeout">300000</property> </component> <component class="org.jboss.seam.core.Ejb" installed="false"/> </components>
I am able to load using the above snippet but no updates are taking place.
I am calling close() with no joy. I tried calling flush() but i get
14:17:30,375 ERROR [STDERR] javax.persistence.TransactionRequiredException: no transaction is in progress 14:17:30,375 ERROR [STDERR] at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:293) 14:17:30,375 ERROR [STDERR] at halvor.schedulers.PendingOrderQuartzTarget.execute(PendingOrderQuartzTarget.java:95) 14:17:30,375 ERROR [STDERR] at org.quartz.core.JobRunShell.run(JobRunShell.java:203) 14:17:30,375 ERROR [STDERR] at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
If i try and use transaction EntityTransaction et = em.getTransaction();
et.begin(); I get...
14:19:00,156 ERROR [STDERR] java.lang.IllegalStateException: JTA EntityManager cannot access a transactions 14:19:00,156 ERROR [STDERR] at org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:316) 14:19:00,156 ERROR [STDERR] at halvor.schedulers.PendingOrderQuartzTarget.execute(PendingOrderQuartzTarget.java:91) 14:19:00,156 ERROR [STDERR] at org.quartz.core.JobRunShell.run(JobRunShell.java:203) 14:19:00,156 ERROR [STDERR] at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
I am clearly missing something obvious so can someone point it out to me plesae.