我有一个使用Hibernate 5.1.0
的Java应用程序,其空间功能(geolatte
)在Weblogic 12.1.1.0
和Oracle
数据库上运行。我有一些配置了驱动程序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
答案 0 :(得分:1)
有关ConnectionFinder界面的用途的说明,请参阅http://www.hibernatespatial.org/documentation/03-dialects/05-oracle/。
如果DefaultConnectionFinder在您的环境中不起作用,您应该创建自己的实现,返回正确的OracleConnection实例,并使用hibernate.spatial.connection_finder
配置属性对其进行配置。