You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ibatis.apache.org by "Brandon Goodin (JIRA)" <ib...@incubator.apache.org> on 2006/06/27 18:23:30 UTC

[jira] Closed: (IBATIS-283) Oracle Objects support in iBatis using TypeHandler

     [ http://issues.apache.org/jira/browse/IBATIS-283?page=all ]
     
Brandon Goodin closed IBATIS-283:
---------------------------------

    Resolution: Fixed

I agree with Jeff... this should be moved over to the user list if more help is needed.

> Oracle Objects support in iBatis using TypeHandler
> --------------------------------------------------
>
>          Key: IBATIS-283
>          URL: http://issues.apache.org/jira/browse/IBATIS-283
>      Project: iBatis for Java
>         Type: Improvement

>   Components: SQL Maps
>  Environment: JBoss, Oracle 9i
>     Reporter: Ashwin
>     Priority: Blocker

>
> We have our legacy database in oracle and the front end of the application was Oracle forms. Now we wish to change the front end to J2EE. We are using Spring as service layer that will call iBatis for data exchange. 
> Now, this legacy database has lots of stored procedures in which some of them returning oracle objects. We tried getting Oracle objects but I guess they are not supported by iBatis. We tried using TypeHandlerCallback using example from following URL: http://issues.apache.org/jira/browse/IBATIS-145 . We are new to iBatis so please help us with an example or a method to get oracle objects.
> Sending you the code snip lets.
> Main.java
>                         SqlMapClient sqlMap;
>                         resource = "SqlMapConfig.xml";
>                         reader = Resources.getResourceAsReader(resource);
>                         sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
>                         Map map = new HashMap();
>                         map.put("msnId","555");
>                         sqlMap.queryForObject("storedFunc", map);
>         List firstList = (List)map.get("output1");
>         Iterator itr = firstList.iterator();
>                         while(itr.hasNext()) {
>                                     VehicleModel vm = (VehicleModel)itr.next();
>                         }           
>                         
> SqlMapConfig.xml
> <sqlMapConfig>
>   <settings cacheModelsEnabled="true"
>     enhancementEnabled="true"
>     lazyLoadingEnabled="true" maxRequests="32"
>     maxSessions="10" maxTransactions="5"
>     useStatementNamespaces="false" />
>   <typeAlias alias="vehicle2Typehandler" type="Vehicle2Typehandler" />
>   <typeHandler javaType="VehicleModel" callback="vehicle2Typehandler" />
>   <transactionManager type="JDBC" >
>     <dataSource type="SIMPLE">
>       <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
>       <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@10.0.4.20:1521:rajeshm"/>
>       <property name="JDBC.Username" value="system"/>
>       <property name="JDBC.Password" value="manager"/>
>     </dataSource>
>   </transactionManager>
>   <sqlMap resource="SQLMap.xml" />
> </sqlMapConfig>
>  SQLMap.xml
>     <!-- Calling the Function -->
>       <parameterMap id="funcInput" class="map" >        
>      <parameter property="output1" jdbcType="VEHICLE2" typeName="VEHICLE2"  typeHandler="Vehicle2Typehandler" mode="OUT"/>
>       <parameter property="msnId" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
>     </parameterMap>
>     <procedure id="storedFunc" parameterMap="funcInput">       
>         {? = call FUNC(?)}
>     </procedure>
>  
> Vehicle2Typehandler.java
> import java.sql.Connection;
> import java.sql.SQLException;
> import java.sql.Types;
> import oracle.sql.ARRAY;
> import oracle.sql.ArrayDescriptor;
> import oracle.sql.StructDescriptor;
> import oracle.sql.STRUCT;
> import com.ibatis.sqlmap.client.extensions.ParameterSetter;
> import com.ibatis.sqlmap.client.extensions.ResultGetter;
> import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
> import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;
> public class Vehicle2Typehandler  implements TypeHandlerCallback 
> {
>             static{ 
>                         JdbcTypeRegistry.setType("VEHICLE2", Types.STRUCT);
>                         }; 
>  
>                         public void setParameter(ParameterSetter setter, Object parameter) 
>                         throws SQLException { 
>                         VehicleModel vehicleModel[] = (VehicleModel[])parameter; 
>                         setter.getPreparedStatement().getConnection();
>                         Connection conn = setter.getPreparedStatement().getConnection(); 
>                         StructDescriptor structDescriptor = StructDescriptor.createDescriptor("VEHICLE2", conn);
>                         STRUCT valStruct; 
>                         try { 
>                                     valStruct = new STRUCT(structDescriptor, conn, vehicleModel);
>                         } catch (SQLException e) { 
>                         throw e; 
>                         } 
>                         setter.setObject(valStruct);
>                         } 
>                          public Object getResult(ResultGetter getter) throws SQLException { 
>                         //Array arr = getter.getArray(); 
>                         VehicleModel vm[] = (VehicleModel[])getter.getObject();
>                         if(vm==null) 
>                         return null; 
>                         else 
>                         //return (String[])arr.getArray();
>                                     return vm;
>                         } 
>                         public Object valueOf(String arg0) {
>                         String[] r = new String[1]; 
>                         r[0] = arg0; 
>                         return r; 
>                         } 
>                         }
> If you notice I have modified the Vehicle2Typehandler.java class from handling ARRAY type to STRUCT type.
> Not sure weather it's the right approach. Getting the following error.
>  
> Exception in thread "main" com.ibatis.common.jdbc.exception.NestedSQLException:   
> --- The error occurred in SQLMap.xml.  
> --- The error occurred while applying a parameter map.  
> --- Check the funcInput.  
> --- Check the output parameters (retrieval of output parameters failed).  
> --- Cause: java.lang.ClassCastException: oracle.sql.STRUCT
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
>       at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
>       at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
>       at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
>       at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
>       at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
>       at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
>       at Main.main(Main.java:31)
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
>       at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
>       at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
>       at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
>       at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
>       at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
>       at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
>       ... 6 more
>  
> Caused by: 
> java.lang.ClassCastException: oracle.sql.STRUCT
>       at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
>       at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
>       at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
>       at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
>       at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
>       at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
>       at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
>       at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
>       at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
>       at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
>       at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
>       at Main.main(Main.java:31)
> Any Help is appreciated !!!!!!!!!!!!!

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira