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.