Hello,
I'm trying to use XMLValueHandler strategy with Postgres 9 and openJPA 2.1.0
without success, although judging by the code other DBs might have similar
problems.

class Run {
...
    @Persistent(
    @Strategy ("org.apache.openjpa.jdbc.meta.strats.XMLValueHandler")    
        private RunConfiguration fConfiguration;
}

where RunConfiguration is properly annotated JAXB class.

This exception occurs even the generated 'Run' table has XML-type field
added and it happens during the named query that does not touch Run objects
that might reference XML field.


<Exception1>

<openjpa-2.1.0-r422266:1071316 fatal user error>
org.apache.openjpa.persistence.ArgumentException:
"gaia.cu7.om.Run.fConfiguration" declares a column that is not compatible
with the expected type "clob".  Column details:
Full Name: Run.fconfiguration
Type: unknown(2009)
Size: 2147483647
Default: null
Not Null: false

        at
org.apache.openjpa.jdbc.meta.MappingInfo.mergeColumn(MappingInfo.java:775)
        at
org.apache.openjpa.jdbc.meta.MappingInfo.createColumns(MappingInfo.java:593)
        at
org.apache.openjpa.jdbc.meta.ValueMappingInfo.getColumns(ValueMappingInfo.java:178)
        at
org.apache.openjpa.jdbc.meta.strats.HandlerStrategies.map(HandlerStrategies.java:65)
        at
org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.map(HandlerFieldStrategy.java:82)
        at
org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:146)
        at
org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:82)
        at
org.apache.openjpa.jdbc.meta.FieldMapping.resolveMapping(FieldMapping.java:496)
        at 
org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:461)
        at
org.apache.openjpa.jdbc.meta.ClassMapping.resolveNonRelationMappings(ClassMapping.java:895)
        at
org.apache.openjpa.jdbc.meta.MappingRepository.prepareMapping(MappingRepository.java:417)
        at
org.apache.openjpa.meta.MetaDataRepository.preMapping(MetaDataRepository.java:762)
        at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:651)
        at
org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411)
        at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384)
        at
org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:714)
        at
org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:643)
        at
org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:411)
        at
org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:384)
        at
org.apache.openjpa.meta.MetaDataRepository.resolveAll(MetaDataRepository.java:1954)
        at
org.apache.openjpa.meta.MetaDataRepository.getQueryMetaDataInternal(MetaDataRepository.java:1932)
        at
org.apache.openjpa.meta.MetaDataRepository.getQueryMetaData(MetaDataRepository.java:1919)
        at
org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1011)
        at
org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:101)
        at gaia.cu7.om.dal.DbVariStore.getAllSources(DbVariStore.java:243)
        
</Exception1>

 
Debugging shows that in MappingInfo.java tmplate.type overrides proper XML
type of col::Column with clob, then causes exception from above.

<Exception2>
<MappingInfo.java:697>
      // use information from template column by default, allowing any
        // user-given specifics to override it
        int type = tmplate.getType();
        int size = tmplate.getSize();
        if (type == Types.OTHER) {
            int precis = 0;
            int scale = 0;
            if(given != null) {
                precis = given.getSize();
                scale = given.getDecimalDigits();
            }
            type =
                dict.getJDBCType(tmplate.getJavaType(), size == -1, precis,
                    scale, tmplate.isXML()); //<-------------- CLOB returned
(2005 instead of 2009 - SQLXML)
        }

I tried to create own XMLValueHandler that sets type to SQLXML on the map()
call, but this gives other errors during insert where insert statement
generated causes exception since it uses JavaTypes.STRING which is not
compatible with SQLXML of course..

<openjpa-2.1.0-r422266:1071316 fatal store error>
org.apache.openjpa.persistence.RollbackException: The transaction has been
rolled back.  See the nested exceptions for details on the errors that
occurred.
FailedObject: gaia.cu7.om.Run@799ac2e3
        at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:585)
...
Caused by: <openjpa-2.1.0-r422266:1071316 fatal general error>
org.apache.openjpa.persistence.PersistenceException: The transaction has
been rolled back.  See the nested exceptions for details on the errors that
occurred.
FailedObject: gaia.cu7.om.Run@799ac2e3
        at
org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2316)
        at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2153)
        at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2051)
        at
org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1969)
        at
org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
        at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1493)
        at
org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:925)
        at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:561)
        ... 27 more
Caused by: <openjpa-2.1.0-r422266:1071316 fatal general error>
org.apache.openjpa.persistence.PersistenceException: ERROR: column
"fconfiguration" is of type xml but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.
  Position: 172 {prepstmnt 2057332087 INSERT INTO cu7user.Run (runid,
fconfiguration, enddate, startdate, name, finputcatalog_catalogid,
finputrun_runid, foutputcatalog_catalogid, fuser_fusername) VALUES (?, ?, ?,
?, ?, ?, ?, ?, ?) [params=?, ?, ?, ?, ?, ?, ?, ?, ?]} [code=0, state=42804]
FailedObject: gaia.cu7.om.Run@799ac2e3
        at 
org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4869)
        at
org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4829)
        at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
        at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:78)
        at
org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:217)
        at
org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:63)
        at
org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:103)
        at
org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76)
        at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:742)
        at
org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
        at
org.apache.openjpa.datacache.DataCacheStoreManager.flush(DataCacheStoreManager.java:661)
        at
org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
        ... 34 more
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ERROR: column
"fconfiguration" is of type xml but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.
  Position: 172 {prepstmnt 2057332087 INSERT INTO cu7user.Run (runid,
fconfiguration, enddate, startdate, name, finputcatalog_catalogid,
finputrun_runid, foutputcatalog_catalogid, fuser_fusername) VALUES (?, ?, ?,
?, ?, ?, ?, ?, ?) [params=?, ?, ?, ?, ?, ?, ?, ?, ?]} [code=0, state=42804]
        at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:281)
        at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:257)
        at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$1000(LoggingConnectionDecorator.java:72)
        at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:1199)
        at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:291)
        at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:291)
        at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1776)
        at
org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:267)
        at
org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushSingleRow(BatchingPreparedStatementManagerImpl.java:246)
        at
org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:155)
        ... 41 more

</Exception2>

Best regards,
Krzysztof


--
View this message in context: 
http://openjpa.208410.n2.nabble.com/XMLValueHandler-strategy-not-supported-in-Postgres-tp6331286p6331286.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to