Oracle Spatial Datatype JGeometry from the spatial api (which can be found here) can easily be used with hibernate through a custom dialect and a custom type that delegates to an instance from oracle sdo api. Everything that is needed is here:
Mapping Spatial Oracle type SDO_GEOMETRY to JGeometry
The only quirk with this solution as of February 2007 is the fact, it won’t work with null columns. The fault lies in nullSafeSet. Either can the JGeometry delegate be null or, what is worse, preparedStatement.setNull( i, Types.OTHER); will fail with an invalid column type. The correct version of this method is as follows:
public void nullSafeSet( PreparedStatement preparedStatement, Object o, int i) throws HibernateException, SQLException { if( o == null) { preparedStatement.setNull(i, Types.STRUCT, "MDSYS.SDO_GEOMETRY"); } else { if( o instanceof JGeometryType) { JGeometryType gt = (JGeometryType) o; OracleConnection oc = (OracleConnection) preparedStatement.getConnection().getMetaData().getConnection(); if(gt.getJGeometry() == null) preparedStatement.setNull(i, Types.STRUCT, "MDSYS.SDO_GEOMETRY"); else preparedStatement.setObject( i, JGeometry.store( (JGeometry) (gt).getJGeometry(), oc)); } } }
Furthermore, i think the spatial dialect should be registered with the following class:
public class OracleSpatialDialect extends Oracle9Dialect { public OracleSpatialDialect() { super(); registerColumnType( Types.OTHER, "MDSYS.SDO_GEOMETRY"); } }
Kudos to Joel Schuster from Navisys for the adapter class!