2016-04-13 32 views
0

aldım Hibernate 5.1.0 kullanarak bir Java uygulamasına sahibim, Weblogic 12.1.1.0 ve Oracle veritabanında çalışan uzamsal yetenekleri (geolatte). Sürücü oracle.jdbc.xa.client.OracleXADataSource ile yapılandırılmış bazı veri kaynaklarına sahibim. Bu tek bir ortamda çalışır, ancak başka bir ortamda değil. Ben hazırda tarafından çağrılır geolatte-geom kütüphanede kodlara göz varsaOracleConnection alma işlemi başlatıldı ancak boş

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) 

Ben aşağıda DefaultConnectionFinder.java bkz:

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

Öyle bir sorgu çalıştırırken aşağıdaki stacktrace olsun Weblogic tarafından sağlanan bağlantı paketini almak ve yansıma kullanarak tüm mevcut yöntemlerle yineleyin. Bir java.sql.Connection.class döndüren ve giriş parametresi olmayan bir yöntemi arayan asıl bağlantıyı almaya çalışır.

Benim tahminim, null döndürür getOriginalOwner yöntem ilk göreceği durum olabilir, bulunan yöntem getConnection olduğu zamanların ama bu durumda en getMethods() gibi belirli bir sırayla değerleri döndürmek olmamasıdır ve istisna olur.

Sanırım burada sorum şu: Yanlış bir şey yaptığımı ve bunun nasıl önlenebileceğini düşündüğüm, ya da Hazırda bekletme hatası olduğu ve null olmadığında bağlantıyı döndürmem gerektiği (boş olduğunda) sadece yineleme) veya benzeri bir şey ile devam edecektir:

final Connection oc = find((Connection) (method.invoke(con, new Object[] { }))); 
if (oc != null) { 
    return oc; 
} 

cevap

1

amacı ConnectionFinder arayüzünün ne olduğu açıklama için http://www.hibernatespatial.org/documentation/03-dialects/05-oracle/ bakınız.

DefaultConnectionFinder ortamınızda çalışmıyorsa, uygun OracleConnection örneğini döndüren kendi uygulamanızı oluşturmalı ve hibernate.spatial.connection_finder yapılandırma özelliğini kullanarak yapılandırabilirsiniz.

+0

Merhaba Karel Maesen, cevabınız için teşekkürler, buna değer katacağını düşünüyorum. Neyse neden bir potansiyel olarak bir bağlantı döndürecek bir yöntem bulduğunuzda bir RuntimeException atacağınızı merak ediyorum ama adayların geri kalanı boyunca yineleme yapmak yerine (getOriginalOwner örneğinde olduğu gibi) bulunmuyorsa ve bunu kontrol edip edemeyeceğinizi kontrol edin. Yukarıdaki kod parçacığında olduğu gibi daha iyi bir tane. Bu yarış durumu gösteren Weblogic 12.1.1.0 idi, bu yüzden bu uygulamanın ele alınacağını düşündüm. – krause