尝试检索OracleConnection但收到null

时间:2016-04-13 17:45:41

标签: java oracle hibernate weblogic12c hibernate-5.x

我有一个使用Hibernate 5.1.0的Java应用程序,其空间功能(geolatte)在Weblogic 12.1.1.0Oracle数据库上运行。我有一些配置了驱动程序oracle.jdbc.xa.client.OracleXADataSource的数据源。这在一个环境中可以正常工作,但在另一个环境中不可运行查询时,我得到以下stacktrace:

org.hibernate.HibernateException: java.lang.RuntimeException: Tried retrieving OracleConnection from weblogic.jdbc.wrapper.JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection using method getOriginalOwner, but received null.
    at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.toNative(SDOGeometryValueBinder.java:88)
    at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.bind(SDOGeometryValueBinder.java:53)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:253)
(...)
Caused by: java.lang.RuntimeException: Tried retrieving OracleConnection from weblogic.jdbc.wrapper.JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection using method getOriginalOwner, but received null.
    at org.geolatte.geom.codec.db.oracle.DefaultConnectionFinder.find(DefaultConnectionFinder.java:75)
    at org.geolatte.geom.codec.db.oracle.OracleJDBCTypeFactory.createStruct(OracleJDBCTypeFactory.java:117)
    at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.store(SDOGeometryValueBinder.java:72)

当我查看Hibernate调用的geolatte-geom库中的代码时,我看到DefaultConnectionFinder.java如下所示:

    for ( Method method : con.getClass().getMethods() ) {
        if ( method.getReturnType().isAssignableFrom(
                java.sql.Connection.class
        )
                && method.getParameterTypes().length == 0 ) {

            try {
                method.setAccessible( true );
                final Connection oc = find( (Connection) ( method.invoke( con, new Object[] { } ) ) );
                if ( oc == null ) {
                    throw new RuntimeException(
                            String.format(
                                    "Tried retrieving OracleConnection from %s using method %s, but received null.",
                                    con.getClass().getCanonicalName(),
                                    method.getName()
                            )
                    );
                }
                return oc;
            }

它正在获取Weblogic提供的连接包装器,并使用反射迭代所有可用的方法。它将尝试检索实际连接,以查找返回java.sql.Connection.class且没有输入参数的方法。

我的猜测是,方法找到的大部分时间都是getConnection,但在这种情况下,由于getMethods()不按特定顺序返回值,因此可能是{{1} 1}}方法首先返回null,然后发生异常。

我想这里我的问题是你是否认为我做错了什么,以及我如何避免这种情况,或者它是一个Hibernate错误,我应该在它不为空时返回连接(当它为null时我将继续进行迭代)或类似的东西:

getOriginalOwner

1 个答案:

答案 0 :(得分:1)

有关ConnectionFinder界面的用途的说明,请参阅http://www.hibernatespatial.org/documentation/03-dialects/05-oracle/

如果DefaultConnectionFinder在您的环境中不起作用,您应该创建自己的实现,返回正确的OracleConnection实例,并使用hibernate.spatial.connection_finder配置属性对其进行配置。