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/

Reply via email to