I agree. This is a good candidate for improvement, could you open a JIRA
issue <https://issues.apache.org/jira/secure/CreateIssue%21default.jspa> for
the problem?

-mike

2011/1/24 Vetal <[email protected]>

> Trying  to  persist object to Oracle with null value at nvarchar2 type
> column causes
>
> Caused by: <openjpa-2.0.1-r422266:989424 fatal general error>
> org.apache.openjpa.persistence.PersistenceException: недействительный шаблон
> имени: CHES.NVARCHAR2
> FailedObject: prepstmnt 1108543980
> INSERT INTO CHES.BAL_ENET_DATA (ID, GUID, NAME,
>        IS_SUBSTATION, IS_CONNECTION, IS_SECTION, TYPEID,
>        EQ_VOLTAGEID, EQ_SUBSTATIONID, EQ_SUBTYPEID3,
>        OWNID, EXPLOID, SUB_REGIONID, INVID, REG_ENPLANTID,
>        SNAPSHOT_DATE, SNAPSHOT_COUNT, PERIOD,
>        EQ_LINEOWNERID, EQ_LINEBEGINID, EQ_LINEENDID,
>        DELETED, NEED_SYNCH, EQ_SECTIONNUM,
>        EQ_GRANDPARENTID, EQ_SUBTYPEID1, IS_CONSUMER,
>        IS_OTHERRES, IS_MV2_INPUT, MANUAL_CONFIG,
>        IS_FROMOTPAIKA, OTPAIKANAME)
>    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
>        ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
>  [org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement_]
>        at
> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4832)
>        at
> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4792)
>        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:222)
>        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:731)
>        at
> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
>        ... 42 more
> Caused by: java.sql.SQLException: недействительный шаблон имени:
> CHES.NVARCHAR2
>        at
> oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
>        at
> oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
>        at
> oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:463)
>        at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:362)
>        at
> oracle.sql.StructDescriptor.initPickler(StructDescriptor.java:319)
>        at oracle.sql.StructDescriptor.<init>(StructDescriptor.java:283)
>        at
> oracle.sql.StructDescriptor.createDescriptor(StructDescriptor.java:194)
>        at
> oracle.sql.StructDescriptor.createDescriptor(StructDescriptor.java:163)
>        at
> oracle.sql.StructDescriptor.createDescriptor(StructDescriptor.java:132)
>        at
> oracle.jdbc.driver.OraclePreparedStatement.setNullCritial(OraclePreparedStatement.java:4180)
>        at
> oracle.jdbc.driver.OraclePreparedStatement.setNullInternal(OraclePreparedStatement.java:4143)
>        at
> oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:4122)
>        at
> com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setNull(NewProxyPreparedStatement.java:183)
>        at
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.setNull(DelegatingPreparedStatement.java:426)
>        at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.setNull(LoggingConnectionDecorator.java:1393)
>        at
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.setNull(DelegatingPreparedStatement.java:426)
>        at
> org.apache.openjpa.jdbc.sql.OracleDictionary.setNull(OracleDictionary.java:559)
>        at
> org.apache.openjpa.jdbc.sql.DBDictionary.setTyped(DBDictionary.java:1221)
>        at org.apache.openjpa.jdbc.sql.RowImpl.flush(RowImpl.java:896)
>        at org.apache.openjpa.jdbc.sql.RowImpl.flush(RowImpl.java:856)
>        at
> org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:168)
>        ... 47 more
>
>
> Overriding  setNull()  in  OracleDictionary  and  using that overrided
> dictionary solves problem for me.
>
> public class OracleDictionary extends
> org.apache.openjpa.jdbc.sql.OracleDictionary
> {
>
>        @Override
>        public void setNull(PreparedStatement stmnt, int idx, int colType,
> Column col) throws SQLException
>        {
>                if
> (col.getTypeIdentifier().getName().toUpperCase().equals("NVARCHAR2"))
>                {
>                        stmnt.setNull(idx, Types.VARCHAR);
>                }
>                else
>                {
>                        super.setNull(stmnt, idx, colType, col);
>                }
>        }
>
> }
>
> But I think that should work without that hack out of the box.
>
> Column  type  of NVARCHAR2 in standart Oracle dictionary determined as
> java.sql.Type.OTHER and causes described problem.
>
>

Reply via email to