Hi Martin,
I am not aware of any problems with SynchronizeMappings not working with
PostgreSQL.  If you turn on trace for OpenJPA, you should see the actual
interaction with the database for creating the tables.  Here's an example
for turning on just the SQL trace, which should be sufficient for debugging
this problem.  But, you can experiment with more trace settings to get more
data.

<property name="openjpa.Log" value="DefaultLevel=WARN,SQL=TRACE"/>

Since this seems to work with HSQL, then you could also run with trace with
that database to see how the tables are being created.

One thought I have is whether you already have a "country" table that exists
in PostgreSQL and it's schema doesn't match with your Entity definitions.

Good luck,
Kevin

On Wed, Jan 28, 2009 at 1:20 AM, David Blevins <[email protected]>wrote:

> Hi Martin,
>
> Your configuration is perfect.  I wonder if the OpenJPA team might be aware
> of anything that might prevent the SynchronizeMappings feature from working
> on PostgreSQL.  Of perhaps if there's a better way to debug exactly what
> table definitions were created in the synchronization process.
>
> -David
>
> On Jan 23, 2009, at 5:02 PM, Martin Uhlir wrote:
>
>  Hi all,
>>
>> I added new DataSources in my openejb.xml file:
>>
>> <Resource id="MyDB" type="DataSource">
>> JdbcDriver org.postgresql.Driver
>> JdbcUrl jdbc:postgresql://localhost/TestDB
>> UserName xxx
>> Password yyy
>> JtaManaged true
>> </Resource>
>>
>> <Resource id="MyDBun" type="DataSource">
>> JdbcDriver org.postgresql.Driver
>> JdbcUrl jdbc:postgresql://localhost/TestDB
>> UserName xxx
>> Password yyy
>> JtaManaged false
>> </Resource>
>>
>> Then I deployed an EJB application with this persistence.xml
>> <persistence-unit name="EJB_Module">
>>
>>  <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
>>      <jta-data-source>MyDB</jta-data-source>
>>      <non-jta-data-source>MyDBun</non-jta-data-source>
>>      <properties>
>>          <property name="openjpa.jdbc.SynchronizeMappings"
>> value="buildSchema(ForeignKeys=true)"/>
>>      </properties>
>> </persistence-unit>
>>
>> So according to SynchronizeMappings the tables etc. shall be automatically
>> created.
>>
>> But running the application I get following exception:
>> <openjpa-1.2.0-r422266:683325 fatal store error>
>> org.apache.openjpa.util.StoreException: The transaction has been rolled
>> back.  See the nested exceptions for details on the errors that occurred.
>>  at
>> org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2163)
>>  at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2010)
>>  at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1908)
>>  at
>> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1826)
>>  at
>> org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:514)
>>  at
>> org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:499)
>>  at
>> org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:400)
>>  at
>> org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:257)
>>  at
>> org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:245)
>>  at
>> org.apache.openejb.core.transaction.JtaTransactionPolicy.completeTransaction(JtaTransactionPolicy.java:291)
>>  at
>> org.apache.openejb.core.transaction.TxRequired.commit(TxRequired.java:71)
>>  at
>> org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke(EjbTransactionUtil.java:74)
>>  at
>> org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:231)
>>  at
>> org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:169)
>>  at
>> org.apache.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD(EjbRequestHandler.java:238)
>>  at
>> org.apache.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:129)
>>  at
>> org.apache.openejb.server.ejbd.EjbDaemon.processEjbRequest(EjbDaemon.java:196)
>>  at org.apache.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:149)
>>  at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:71)
>>  at
>> org.apache.openejb.server.ejbd.KeepAliveServer$Session.service(KeepAliveServer.java:213)
>>  at
>> org.apache.openejb.server.ejbd.KeepAliveServer.service(KeepAliveServer.java:233)
>>  at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:66)
>>  at org.apache.openejb.server.ServicePool$2.run(ServicePool.java:91)
>>  at org.apache.openejb.server.ServicePool$3.run(ServicePool.java:120)
>>  at
>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>>  at
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>>  at java.lang.Thread.run(Thread.java:619)
>> Caused by: <openjpa-1.2.0-r422266:683325 nonfatal store error>
>> org.apache.openjpa.util.StoreException: ERROR: relation "country" does not
>> exist {prepstmnt 16963612 INSERT INTO Country (id, name) VALUES (?, ?)
>> [params=(long) 5, (String) aaa]} [code=0, state=42P01]
>> FailedObject: carpool.entities.coun...@17a687b
>>  at
>> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4238)
>>  at
>> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4203)
>>  at
>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102)
>>  at
>> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:72)
>>  at
>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:131)
>>  at
>> org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:82)
>>  at
>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:89)
>>  at
>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:72)
>>  at
>> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:543)
>>  at
>> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:105)
>>  at
>> org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59)
>>  at
>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:89)
>>  at
>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72)
>>  at
>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:655)
>>  at
>> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130)
>>  ... 26 more
>> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ERROR:
>> relation "country" does not exist {prepstmnt 16963612 INSERT INTO Country
>> (id, name) VALUES (?, ?) [params=(long) 5, (String) aaa]} [code=0,
>> state=42P01]
>>  at
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:192)
>>  at
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:57)
>>  at
>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:866)
>>  at
>> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269)
>>  at
>> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269)
>>  at
>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1504)
>>  at
>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:151)
>>  at
>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:120)
>>  ... 36 more
>>
>>
>>
>> What does this '.....relation "country" does not exist".....' mean? I'm
>> just using this simple entity bean which I try to persist in a stateless
>> session bean.
>> @Entity
>> public class Country {
>>  private Long id;
>>  private String name;
>>
>>  public void setId(Long id) {
>>      this.id = id;
>>  }
>>
>>  @Id
>>  public Long getId() {
>>      return id;
>>  }
>>
>>  public void setName(String name) {
>>      this.name = name;
>>  }
>>
>>  public String getName() {
>>      return name;
>>  }
>> }
>>
>>
>> When I change my persistence.xml to the DataSources provided by openejb by
>> default
>> <jta-data-source>My DataSource</jta-data-source>
>> <non-jta-data-source>My Unmanaged DataSource</non-jta-data-source>
>> then everything works just fine (but I don't want to use the default HSQL
>> database).
>>
>> Thank you for any help in advance.
>>
>>
>

Reply via email to