代码之家  ›  专栏  ›  技术社区  ›  Ahmad Sadeghian

无法从PreparedStatement获取OracleSpatial连接对象

  •  2
  • Ahmad Sadeghian  · 技术社区  · 8 年前

    我正在使用hibernate spatial 4.3.2和hibernate 4.3.11,我的数据库是oracle 12c。 我使用hikariCP作为连接池。当我使用hikacriCP时,我得到一个错误,原因似乎是hibernate spatial无法访问hikari连接实例的包装连接,这是我的例外: 问题是hibernate在保存包含几何体字段的实体时引发错误。

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

    当我移除hikari时,一切都很好! 这是我的实体和xml映射文件。

    <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;
        }
    }
    

    下面是保存实体的代码:

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

    在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
    

    这是我的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 回复  |  直到 8 年前
        1
  •  1
  •   dyegows    8 年前

    我也遇到了同样的问题,通过提供自己的连接查找器接口实现并在hibernate中进行配置,解决了这个问题。空间的connection\u finder属性。

    获取甲骨文。jdbc。驾驶员Hikari的OracleConnection您可以使用:

    ((HikariProxyConnection) connection).unwrap(OracleConnection.class);
    
        2
  •  0
  •   Ahmad Sadeghian    7 年前

    通过扩展DefaultConnectionFinder并重写find方法,我最终解决了这个问题:

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