Couldn't get at the OracleSpatial Connection object from the PreparedStatement


Couldn't get at the OracleSpatial Connection object from the PreparedStatement



i am using hibernate spatial 4.3.2 along with hibernate 4.3.11 and my db is oracle 12c.
I use hikariCP for connection pool. when I use hikacriCP I get an error that seems that cause is hibernate spatial can not access to the wrapped connection of hikari connection instance, this is my exception:
problem is hibernate throws error when saving an entity that contains geometry field.


Couldn't get at the OracleSpatial Connection object from the PreparedStatement



when I remove hikari, everything is fine!
here is my entity and xml mapping file.


<hibernate-mapping>
<class name="MyPoint" table="MyPoint" >
<id name="id" type="long" >
<column name="ID" />
<generator class="sequence" >
<param name="sequence">SEQ_MyPoint</param>
</generator>
</id>
<property name="name" column="name" type="string" not-null="true" />
<property name="geom" column="geom" type="org.hibernate.spatial.GeometryType" not-null="true" />

</class>
</hibernate-mapping>


public class MyPoint extends BaseEntity<Long> {
private String name;
private Point geom;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Point getGeom() {
return geom;
}

public void setGeom(Point geom) {
this.geom = geom;
}
}



and here is code to save entity:


Geometry geom = wktToGeometry(wkt);
geom.setSRID(4326);
MyPoint p= new MyPoint();
p.setName("some one");
p.setGeom((Point) geom);
repository.save(p);



hibernate spatial config in yml:


jpa:
open-in-view: false
hibernate:
ddl-auto: update
naming:
strategy: org.hibernate.cfg.ImprovedNamingStrategy
properties:
hibernate:
dialect: org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect
default_schema: my_schema
show_sql: true
current_session_context_class: org.springframework.orm.hibernate4.SpringSessionContext
spatial:
ogc_strict: true
connection_finder: org.hibernate.spatial.dialect.oracle.DefaultConnectionFinder



here is my stacktrace:


Caused by: org.hibernate.HibernateException: Problem finding Oracle Connection
at org.hibernate.spatial.dialect.oracle.OracleJDBCTypeFactory.createStruct(OracleJDBCTypeFactory.java:123)
at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.store(SDOGeometryValueBinder.java:76)
at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.toNative(SDOGeometryValueBinder.java:83)
at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.bind(SDOGeometryValueBinder.java:66)
at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.bind(SDOGeometryValueBinder.java:52)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281)
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:56)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2843)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3121)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
... 138 more
Caused by: org.hibernate.spatial.helper.FinderException: Couldn't get at the OracleSpatial Connection object from the PreparedStatement.
at org.hibernate.spatial.dialect.oracle.DefaultConnectionFinder.find(DefaultConnectionFinder.java:103)
at org.hibernate.spatial.dialect.oracle.DefaultConnectionFinder.find(DefaultConnectionFinder.java:44)
at org.hibernate.spatial.dialect.oracle.OracleJDBCTypeFactory.createStruct(OracleJDBCTypeFactory.java:121)
... 158 more

2017-12-11 16:10:00 INFO o.h.e.j.b.internal.AbstractBatchImpl - HHH000010: On release of batch it still contained JDBC statements




2 Answers
2



I had the same issue and solved it by providing my own implementation of Connection finder interface and configuring it in the hibernate.spatial.connection_finder property.



To get an oracle.jdbc.driver.OracleConnection from Hikari you can use:


((HikariProxyConnection) connection).unwrap(OracleConnection.class);



I finally solved the problem, by extending DefaultConnectionFinder and overriding find method:


@Override
public Connection find(Connection con) {
Field delegate = ((HikariProxyConnection) con).getClass().getSuperclass().getDeclaredField("delegate");
delegate.setAccessible(true);
return (Connection) delegate.get(con);
}






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

List of Kim Possible characters

Audio Livestreaming with Python & Flask

NSwag: Generate C# Client from multiple Versions of an API