2016-04-01 39 views
1

kullanarak karmaşık nesne türü parametreleriyle Oracle'da saklı yordam çağırma Oracle 12c'den beri deprecation of JPublisher nedeniyle, oluşturulan sınıflar ve JDBC yerine karmaşık nesne türleri ile karmaşık nesne türlerini saklı yordamları nasıl arayabileceğimizi başka yollardan düşünüyoruz.EclipseLink

EclipseLink JPA Extensions, bu konuda yardımcı olabilecek tek araçtır. Bulduğum örnekleri takiben, prosedürleri argüman olarak basit tiplerle çağırabilirim. Ancak, varlık sınıflarım, nesneler biraz daha karmaşık olduğunda, veritabanındaki PL/SQL Nesne türlerine doğru şekilde eşlenmelerini sağlayacak şekilde açıklama ekleyemedim.

Örneğin

biz bir giriş ve tip yapısı aşağıdaki aynı nesne türü A bir çıkış parametresi olan bir saklı yordam adres:

Nesne tipi içerir < - < tablo Tablo B tipi olan - < içeren nesne türü C - Tablo türü D, < tablosu - Nesne türü E.

Tablo türleri için @OracleObject öğelerini ve Tablo türleri için @PLSQLTable kullanacağımı düşündüm ama bulamadım Bunları birlikte doğru şekilde birleştirmenin bir yolu.

// All annotations with the required elements 

@Embeddable 
@Struct 
@OracleObject 
public class A { 
    @Column(name = "B") 
    private B b; 

    // Getter and setter 
} 

@Embeddable 
@Struct 
@PLSQLTable (.., nestedType = "C") 
public class B { } 

@Embeddable 
@Struct 
@OracleObject 
public class C {} 

Sınıf A'ya uygun açıklama elemanları ve/veya sınıf C ancak Java ve DB nesneleri eşleşmeyebileceğinden ile @PLSQLTable eklemek için denedim:

Aşağıdaki denedim birbirine doğru ve arama sırasında java.sql.SQLException: Invalid column type alıyorum.

birisi A Nesne olduğunu EclipseLink anlatmak için ek açıklamaları nasıl kullanılacağını bana açıklayabilir eğer ben çok takdir ediyorum C.

Çok teşekkür ederim Nesne Tablo B içerir.

cevap

0

Aynı sorun burada. Spring Data Oracle Extension projesinin yoluna devam ediyorum. Ancak verilen örnek karmaşık bir nesne değil, basit bir pojo.
Bulunduğum her yerde örnek bulunmamasına rağmen, SqlReturnSqlData() aracılığıyla çok karmaşık bir nesneyi geri çekebiliyordum, ancak karmaşık bir nesneyi oracle saklı yordamına eklemenin bir yolunu bulamıyorum. Özel karmaşık Oracle Türleri'nin nasıl eklendiğine dair henüz tam bir örnek bulmuyorum. Bahar ya da başka bir yolla.

+0

Sonunda JDBC kullanmaya karar verdik. [JDBC Guide] 'da açıklandığı gibi SQLData interaface'ı uygulayan tip sınıfları için basit bir jeneratör yazdım (https://docs.oracle.com/database/121/JJDBC/oraoot.htm#JJDBC28461). Daha sonra saklı yordamı çağırmak için oluşturulan sınıflarla birlikte [OracleCallableStatement] (https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleCallableStatement.html) kullanın. Koleksiyon türü öznitelikleri için, SQLData'yi uygulayan Java sınıfı içinde [OracleArray] (https://docs.oracle.com/database/121/JJDBC/oraarr.htm#i1056527) kullanabilirsiniz. –

+0

Tebrikler. Kendinden tanımlı alt nesnelerle ekleyebiliyor musunuz? Örneğin, bir ebeveyn Araba ve çocuk Radyo ile. Aşağıdaki ana için readSQL yöntemini kullanıyorum: setRadio ((Radio) stream.readObject()); Çalışma zamanında derlemesine rağmen, çalışma zamanında bir döküm özel durumu atar. xception: oracle.sql.STRUCT, com.foo.beans.Radio'ya radyosunun bir Struct veya STRUCT olmasını istediği gibi gönderilemez. Dokümanlar bunu yapmak zorunda olmadığınızı söylüyor, ancak dokümanlar ana çocuk ilişkisi için tam bir örnek teşkil etmiyor gibi görünüyor. Sanırım sorun olmadan readSQL'inizde de aynısını yapıyorsunuz. – Jason

+0

Sorunum, typeMap'in alt nesnelerle ilgili değerlere sahip olmamasıydı.Spring Data JDBC Eklentileri projesi, typeMap'i kolaylıkla veya tür haritasının alt nesnelerle ayarlanma örneklerini göstermez. – Jason