> You are correct. It isn't happening inside a transaction. Did that fix your problem?
Thanks, Rick On Tue, May 8, 2012 at 11:20 AM, Will Hoover <java.whoo...@gmail.com> wrote: > Hi Rick, > > You are correct. It isn't happening inside a transaction. > > -----Original Message----- > From: Rick Curtis [mailto:curti...@gmail.com] > Sent: Tuesday, May 08, 2012 9:18 AM > To: users@openjpa.apache.org > Subject: Re: OpenJPA 2.2.0 + Atomikos + Embedded Jetty > > Will - > > I'm betting that the em.persist(..) call isn't happening inside a > transaction. Can you enable openjpa trace[1] and rerun your scenario? > > [1] <property name="openjpa.Log" value="DefaultLevel=trace" /> > > Thanks, > Rick > > On Wed, May 2, 2012 at 1:12 PM, Will Hoover <java.whoo...@gmail.com> > wrote: > > > I have successfully setup an OpenJPA (2.2.0) + Atomikos (3.7.1) + > Embedded > > Jetty (8.1.2) stack (example code below). Everything seems to works > without > > any errors, but OpenJPA doesn't seem to recognize dirty entities after a > > call to EntityManager#persist and a new EntityManager is created (see > > DefaultAppServlet.java below). Any idea why this would be happening? > > > > ServiceManager.java > > > > public class ServiceManager { > > > > private static final Logger log = > > LoggerFactory.getLogger(ServiceManager.class); > > public static final String DEFAULT_PERSISTENT_UNIT = "test-pu"; > > private static EntityManagerFactory factory; > > private static WebServer webServer; > > > > public static void startServices(final String persistentUnit) { > > stopServices(); > > setEmFactory(null); > > webServer = WebServer.start(9080); > > } > > public static void stopServices() { > > if (webServer != null) { > > webServer.stop(); > > } > > try { > > if (factory != null && factory.isOpen()) { > > factory.close(); > > } > > factory = null; > > } catch (final Exception e) { > > log.error("Unable to close " + > > EntityManagerFactory.class.getSimpleName(), e); > > } > > } > > public static final EntityManagerFactory getEmFactory() { > > return factory; > > } > > protected static final void setEmFactory(final > EntityManagerFactory > > factory) { > > if (ServiceManager.factory != null && > > ServiceManager.factory.isOpen()) { > > ServiceManager.factory.close(); > > } > > if (factory == null || !factory.isOpen()) { > > ServiceManager.factory = Persistence. > > > > createEntityManagerFactory(DEFAULT_PERSISTENT_UNIT, > > System.getProperties()); > > } > > ServiceManager.factory = factory; > > } > > } > > > > WebServer.java > > > > public class WebServer { > > > > private static final Logger log = > > LoggerFactory.getLogger(WebServer.class); > > private final int portNumber; > > private Server server; > > > > private WebServer(final int portNumber) { > > this.portNumber = portNumber <=0 ? 80 : portNumber; > > } > > public static final WebServer start() { > > final WebServer webServer = new WebServer(); > > final Thread webServerAgent = new > > Thread(Thread.currentThread().getThreadGroup(), new Runnable() { > > @Override > > public void run() { > > webServer.startServer(); > > } > > }, WebServer.class.getSimpleName() + '-' + > > System.currentTimeMillis()); > > webServerAgent.setDaemon(true); > > webServerAgent.start(); > > return webServer; > > } > > protected final void startServer() { > > try { > > final Resource serverXml = > > Resource.newSystemResource("META-INF/jetty.xml"); > > final XmlConfiguration configuration = new > > XmlConfiguration(serverXml.getInputStream()); > > server = (Server) configuration.configure(); > > // set the connector based upon user settings > > final SelectChannelConnector defaultConnnector = > new > > SelectChannelConnector(); > > defaultConnnector.setPort(getPortNumber()); > > server.setConnectors(new Connector[] { > > defaultConnnector }); > > > > final EnumSet<DispatcherType> dispatchers = > > EnumSet.range(DispatcherType.FORWARD, DispatcherType.ERROR); > > ServletContextHandler context = new > > ServletContextHandler(ServletContextHandler.SESSIONS); > > context.setContextPath("/"); > > context.addFilter(TransactionFilter.class, "/*", > > dispatchers); > > context.addServlet(DefaultAppServlet.class, "/"); > > server.setHandler(context); > > > > server.setDumpAfterStart(true); > > server.start(); > > server.join(); > > } catch (final Throwable e) { > > log.error("Unable to start web server", e); > > } > > } > > public final void stop() { > > try { > > if (server != null && !server.isStopped() && > > !server.isStopping()) { > > server.stop(); > > } > > server.destroy(); > > } catch (final Exception e) { > > log.error("Unable to shutdown", e); > > } > > } > > public int getPortNumber() { > > return portNumber; > > } > > } > > > > DefaultAppServlet.java > > > > public class DefaultAppServlet extends DefaultServlet { > > > > private static final Logger log = > > LoggerFactory.getLogger(DefaultAppServlet.class); > > public DefaultAppServlet() { > > super(); > > } > > @Override > > protected void doGet(HttpServletRequest request, > HttpServletResponse > > response) throws ServletException, IOException { > > response.setContentType("text/html;charset=utf-8"); > > response.setStatus(HttpServletResponse.SC_OK); > > response.getWriter().println("<h1>Hello Message > > World</h1>"); > > try { > > EntityManager em = > > ServiceManager.getEmFactory().createEntityManager(); > > final Message msg = new Message("Hello > Persistence! > > " + System.currentTimeMillis()); > > em.persist(msg); > > em.close(); > > > > // DOES NOT RECOGNIZE THE ENTITY JUST PERSISTED > > EntityManager em2 = > > ServiceManager.getEmFactory().createEntityManager(); > > Query q = em2.createQuery("select m from Message m"); > > for (Message m : (List<Message>) q.getResultList()) { > > System.out.println(m.getMessage() + " (created on: " + > > m.getCreated() + ')'); > > response.getWriter().println("<h3>" + m.getMessage() + > " > > (created on: " + m.getCreated() + ')' + "</h3>"); > > } > > em2.close(); > > } catch (Throwable t) { > > log.error("Error: ", t); > > } > > } > > } > > > > TransactionFilter.java > > > > public class TransactionFilter implements Filter { > > > > public void doFilter(ServletRequest request, ServletResponse > > response, FilterChain chain) { > > try { > > > > // start a new transaction for this request > > getTransaction().setTransactionTimeout(10000); > > getTransaction().begin(); > > > > // delegate the request to the next filter, and > > eventually to the > > // target servlet or JSP > > chain.doFilter(request, response); > > > > // if no exception happened: commit the > transaction > > getTransaction().commit(); > > } catch (final Throwable t) { > > // analyze exception to dermine of rollback is > > required or not > > // and then call rollback or commit on utx as > > appropriate > > t.printStackTrace(); > > try { > > getTransaction().rollback(); > > } catch (final Throwable t2) { > > t2.printStackTrace(); > > } > > } > > } > > @Override > > public void destroy() { > > } > > @Override > > public void init(FilterConfig filterConfig) throws > ServletException > > { > > } > > protected TransactionManager getTransaction() { > > try { > > // from Jetty JNDI configuration > > return (TransactionManager) new > > InitialContext().lookup("UserTransaction"); > > } catch (final NamingException e) { > > e.printStackTrace(); > > } > > return null; > > } > > > > } > > > > META-INF/persistence.xml > > > > <?xml version="1.0"?> > > <persistence xmlns="http://java.sun.com/xml/ns/persistence" > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > xsi:schemaLocation="http://java.sun.com/xml/ns/persistence > > http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" > > version="2.0"> > > <persistence-unit name="test-pu" transaction-type="JTA"> > > > > > <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> > > <jta-data-source>jdbc/testDS</jta-data-source> > > <class>com.example.jpa.entity.Message</class> > > <properties> > > <property name="openjpa.jdbc.SynchronizeMappings" > > value="buildSchema(ForeignKeys=true)"/> > > <!-- <property name="openjpa.jdbc.JDBCListeners" > value=" > > com.example.jpa.UGateJdbcListener"/> --> > > <!-- <property name="openjpa.DynamicEnhancementAgent" > > value="false"/> --> > > <property > name="openjpa.ConnectionFactoryProperties" > > value="PrettyPrint=true, PrettyPrintLineLength=72" /> > > <property name="openjpa.Log" > > value="DefaultLevel=WARN, Tool=INFO, SQL=WARN"/> > > > > <property name="openjpa.ConnectionFactoryMode" > > value="managed" /> > > <property name="openjpa.TransactionMode" > > value="managed" /> > > <property name="openjpa.ManagedRuntime" > > > > value="jndi(TransactionManagerName=UserTransaction)" /> > > <!-- <property name="openjpa.ManagedRuntime" --> > > <!-- > > > > > > value="invocation(TransactionManagerMethod=com.atomikos.icatch.jta.Transacti > > onManagerImp.getTransactionManager)" /> --> > > </properties> > > </persistence-unit> > > </persistence> > > > > Jetty (plus: jetty-all version 8.1.2) configuration > > > > <?xml version="1.0"?> > > <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" > > "http://www.eclipse.org/jetty/configure.dtd"> > > <Configure id="Server" class="org.eclipse.jetty.server.Server"> > > <!-- =========================================================== > --> > > <!-- Define a server aware DB XA connection data source --> > > <!-- =========================================================== > --> > > <New id="xaDataSource" > class="org.eclipse.jetty.plus.jndi.Resource"> > > <Arg></Arg> > > <Arg>jdbc/testDS</Arg> > > <Arg> > > <New id="atomikosDS" > > class="com.atomikos.jdbc.AtomikosDataSourceBean"> > > <Set name="minPoolSize">2</Set> > > <Set name="maxPoolSize">50</Set> > > <Set > > name="xaDataSourceClassName">org.h2.jdbcx.JdbcDataSource</Set> > > <Set > > name="UniqueResourceName">jdbc/testDS</Set> > > <Set name="testQuery">SELECT 1 and SELECT > 1 > > FROM DUAL</Set> > > <Get name="xaProperties"> > > <Call name="setProperty"> > > <!-- Must be upper case > --> > > <Arg>URL</Arg> > > > > > > > > <Arg>jdbc:h2:~/test;AUTO_SERVER=TRUE;FILE_LOCK=SOCKET;TRACE_LEVEL_FILE=0;TRA > > CE_LEVEL_SYSTEM_OUT=1</Arg> > > </Call> > > <Call name="setProperty"> > > <Arg>user</Arg> > > <Arg>sa</Arg> > > </Call> > > <Call name="setProperty"> > > <Arg>password</Arg> > > <Arg>sa</Arg> > > </Call> > > </Get> > > </New> > > </Arg> > > </New> > > <!-- =========================================================== > --> > > <!-- Add a closer bean that will dispose of the DB DS --> > > <!-- =========================================================== > --> > > <Ref id='Server'> > > <Call name="addBean"> > > <Arg> > > <New > > class="org.eclipse.jetty.jndi.DataSourceCloser"> > > <Arg> > > <Ref id="atomikosDS" /> > > </Arg> > > </New> > > </Arg> > > </Call> > > </Ref> > > <!-- =========================================================== > --> > > <!-- Define server transaction aware JTA implementation --> > > <!-- =========================================================== > --> > > <New id="tx" class="org.eclipse.jetty.plus.jndi.Transaction"> > > <Arg> > > <New > > class="com.atomikos.icatch.jta.UserTransactionManager" /> > > </Arg> > > </New> > > > > ... > > > > </Configure> > > > > > > > -- > *Rick Curtis* > > -- *Rick Curtis*