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/