You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Milosz Tylenda (JIRA)" <ji...@apache.org> on 2010/06/25 09:21:49 UTC

[jira] Resolved: (OPENJPA-1687) @Strategy and @ElementStrategy handling resets/obstructs SQL type set in the custom handler map() call.

     [ https://issues.apache.org/jira/browse/OPENJPA-1687?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Milosz Tylenda resolved OPENJPA-1687.
-------------------------------------

    Resolution: Not A Problem

> @Strategy and @ElementStrategy handling resets/obstructs SQL type set in the custom handler map() call.
> -------------------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-1687
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1687
>             Project: OpenJPA
>          Issue Type: Bug
>    Affects Versions: 2.0.0
>         Environment: OS X, Linux
>            Reporter: Krzysztof
>            Assignee: Milosz Tylenda
>
> OpenJPA advertises itself as an expandable framework and provides @Strategy (and undocumented) @ElementStrategy annotations to create custom java<->SQL mappings.
> I would like to create support for already existing JDBC4 standard mapping of primitive arrays in i.e. Postgres:
> java double[] <-> SQL float8[]
> Unfortunately it is not possible using @Strategy as enhancer blindly checks if the field is a collection/array and refuses to do anything with it.
> In the case like this a field should not be delegated to an external table but simply embedded - same way LOBs are, with different toDataStoreValue/toObjectValue pair as provided in the strategy implementation below..
> If we use @ElementStrategy however, i.e.:
> <class>
>  @PersistentCollection
>     @ElementStrategy("gaia.cu7.dal.PostgresJPAArrayHandler")
>     @ElementColumns({
>         @ElementColumn(name="TDOUBLE")
>     })
>  private double tdouble[];
> </class>
> then enhancer accepts it. Schema synchronisation creates wrong DDL suppressing given SQL type and mapping it to SQL keyword ARRAY in the external table.
> Does this rather simple requirement is not covered by openJPA? 
> public class PostgresJPAArrayHandler
>     extends AbstractValueHandler {
>  public PostgresJPAArrayHandler()
>  {
>  
>  }
>      /**
> 	 * Serialization ID
> 	 */
> 	private static final long serialVersionUID = 1L;
> 	private static final PostgresJPAArrayHandler _instance =
>             new PostgresJPAArrayHandler();
>     /**
>      * Singleton instance.
>      */
>     public static PostgresJPAArrayHandler getInstance() {
>         return _instance;
>     }
>     public Column[] map(ValueMapping vm, String name, ColumnIO io,
>         boolean adapt) {
>         Column col = new Column();
>         col.setName(name);        
>         col.setType(JavaSQLTypes.SQL_ARRAY);
>         col.setTypeName("float8[]");    //////<<<--------------------- this gets reset in mergeField or whereabouts
>  
>         return new Column[]{ col };
>     }
>     public Object toDataStoreValue(ValueMapping vm, Object val,
>         JDBCStore store) {
>     	//this has to be array of some integer or double for now
>     	if (val instanceof double[]) {
>     		
> 			try {
> 				Array darr = store.getConnection().createArrayOf("double", (Object[]) ( ArrayUtils.toObject((double[])val)));
> 				return darr;
> 			} catch (SQLException e) {
> 				// TODO Auto-generated catch block
> 				e.printStackTrace();
> 			}
> 			
> 		}
>         return  null;
>     }
>     /** Convert from DB rep into OM representation */
>     public Object toObjectValue(ValueMapping vm, Object val) {
>         if (val == null)
>             return null;
>         return ArrayUtils.toPrimitive((Double[])val);
>     }
>     
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.