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. > >
