Hi Johannes , The specification says that you can create a query without any active transaction http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#createNativeQuery(java.lang.String) http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#createNativeQuery(java.lang.String) .
But, if you look Query specification http://java.sun.com/javaee/5/docs/api/javax/persistence/Query.html#executeUpdate() http://java.sun.com/javaee/5/docs/api/javax/persistence/Query.html#executeUpdate() you will see that you need to have a active transaction that's why you get this TransactionRequiredException. AFAIK, only searching is allowed without transaction. Hope it helps. Jean-Louis Johannes Stamminger-2 wrote: > > > Hi, > > > I run into troubles with having a stateless bean trying to execute a > tablespace/database creation sql statement (bwo createNativeQuery): > > With beans default behaviour (container managed transaction) I run into a > postgres exception > > org.postgresql.util.PSQLException: ERROR: CREATE TABLESPACE cannot run > inside > a transaction block > > (roles and user creations before this work like a charme) > > > With "native" jdbc connection I experienced this being executable only > with > enabling auto-commit and not using transactions. So I tried with switching > auto-commit on for the EntityManager created from an injected > EntityManagerFactory. > > @PersistenceUnit(unitName = "valuesDb") > private EntityManagerFactory fEntityManagerFactory; > private EntityManager fEntityManager; > > @PostConstruct > private void initEntityManager() { > fEntityManager = fEntityManagerFactory.createEntityManager(); > fEntityManager.setFlushMode(FlushModeType.AUTO); > } > > Now the statement no longer get's executed at all as already the openjpa > refuses with > > [junit] Caused by: <openjpa-1.2.0-r422266:683325 nonfatal user error> > org.apache.openjpa.persistence.TransactionRequiredException: Can only > perform > operation while a transaction is active. > [junit] at > org.apache.openjpa.kernel.BrokerImpl.assertActiveTransaction(BrokerImpl.java:4380) > [junit] at > org.apache.openjpa.kernel.QueryImpl.assertBulkModify(QueryImpl.java:1655) > [junit] at > org.apache.openjpa.kernel.QueryImpl.update(QueryImpl.java:1038) > [junit] at > org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:809) > [junit] at > org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:884) > [junit] at > org.apache.openjpa.kernel.QueryImpl.updateAll(QueryImpl.java:880) > [junit] at > org.apache.openjpa.kernel.DelegatingQuery.updateAll(DelegatingQuery.java:565) > [junit] at > org.apache.openjpa.persistence.QueryImpl.executeUpdate(QueryImpl.java:338) > > > Same happens with annotating the class with (without switching auto-commit > on) > > @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) > > and/or > > @TransactionManagement(TransactionManagementType.BEAN) > > > > Is it not possible to execute this really special statement (one that > executeUpdate refuses to within a transaction)? And/Or what am I doing > wrong? > > > (*Please* do not start a discussion on the necessity of > database/tablespace > creation ;-), this would be of no help for me currently) > > > > For completeness: my persistence.xml looks minimalistic: > <persistence-unit name="valuesDb"> > <jta-data-source>valuesDbJtaDs</jta-data-source> > <non-jta-data-source>valuesDbNonJtaDs</non-jta-data-source> > </persistence-unit> > > The connection properties are set by way of properties to the > InitialContext > creation: > properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, > > "org.apache.openejb.client.RemoteInitialContextFactory"); > > properties.setProperty("valuesDbJtaDs", "new://Resource?type=DataSource"); > properties.setProperty("valuesDbJtaDs.JdbcDriver", > Driver.class.getName()); > properties.setProperty("valuesDbJtaDs.JdbcUrl", ...); > properties.setProperty("valuesDbJtaDs.UserName", ...); > properties.setProperty("valuesDbJtaDs.Password", ...); > properties.setProperty("valuesDbJtaDs.JtaManaged", "true"); > > properties.setProperty("valuesDbNonJtaDs", > "new://Resource?type=DataSource"); > properties.setProperty("valuesDbNonJtaDs.JdbcDriver", > Driver.class.getName()); > properties.setProperty("valuesDbNonJtaDs.JdbcUrl", ...); > properties.setProperty("valuesDbNonJtaDs.UserName", ...); > properties.setProperty("valuesDbNonJtaDs.Password", ...); > properties.setProperty("valuesDbNonJtaDs.JtaManaged", "false"); > > > > OpenEJB newby, > Johannes > > This email (including any attachments) may contain confidential and/or > privileged information or information otherwise protected from disclosure. > If you are not the intended recipient, please notify the sender > immediately, do not copy this message or any attachments and do not use it > for any purpose or disclose its content to any person, but delete this > message and any attachments from your system. Astrium disclaims any and > all liability if this email transmission was virus corrupted, altered or > falsified. > --------------------------------------------------------- > Astrium GmbH Vorsitzender des Aufsichtsrates: Thomas Mueller - > Geschaeftsfuehrung: Evert Dudok (Vorsitzender), Dr. Reinhold Lutz, Guenter > Stamerjohanns, Josef Stukenborg > Sitz der Gesellschaft: Muenchen - Registergericht: Amtsgericht Muenchen, > HRB Nr. 107 647 > > Weitere Informationen ueber EADS Astrium @ http://www.astrium.eads.net/ > > -- View this message in context: http://www.nabble.com/TransactionRequiredException-vs-must-not-execute-within-transaction-tp25066470p25069198.html Sent from the OpenEJB User mailing list archive at Nabble.com.
