2016-04-01 9 views
1

Aufgrund der deprecation of JPublisher seit Oracle 12c betrachten wir derzeit andere Möglichkeiten, wie wir gespeicherte Prozeduren mit komplexen Objekttypen als Parameter anstelle von generierten Klassen und JDBC aufrufen können.Aufrufen gespeicherter Prozeduren in Oracle mit komplexen Objekttypparametern unter Verwendung von EclipseLink

Es scheint, dass EclipseLink JPA Extensions das einzige Werkzeug ist, das dabei helfen kann. Nach den Beispielen, die ich gefunden habe, könnte ich Prozeduren mit einfachen Typen als Argumente aufrufen. Aber ich konnte meine Entitätsklassen nicht mit Anmerkungen versehen, damit sie den PL/SQL-Objekttypen in der Datenbank korrekt zugeordnet werden, wenn die Objekte etwas komplexer sind.

Zum Beispiel haben wir eine gespeicherte Prozedur, die den Typ-Struktur folgt einen Eingang und einen Ausgangsparameter des gleichen Objekttyp A. hat:

Objekttyp A enthält < - Table Typ B ist, die Tabelle von < - Objekttyp C, der < enthält - Tabellentyp D ist die Tabelle < - Objekttyp E.

Ich dachte mir, ich sollte das @OracleObject für die Objekttypen und @PLSQLTable für die Tabellentypen verwenden, aber ich habe es nicht gefunden ein Weg, sie richtig zu kombinieren.

Ich habe versucht, die folgenden:

// 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 {} 

Ich habe versucht, die @PLSQLTable mit den richtigen Beschriftungselemente der Klasse A und/oder der Klasse C, aber die Java und DB-Objekte abbilden nicht hinzufügen miteinander richtig und ich bekomme die java.sql.SQLException: Invalid column type während des Anrufs.

würde ich sehr dankbar, wenn mir jemand erklären könnte, wie die Anmerkungen zu verwenden, um die Eclipselink zu sagen, dass ein Objekt enthält Tabelle B des Objekt C.

Ihnen sehr danken.

Antwort

0

Gleiches Problem hier. Ich bin den Pfad des Spring Data Oracle Extension-Projekts gegangen. Das angegebene Beispiel ist jedoch ein einfaches Pojo, kein komplexes Objekt.
Trotz eines Mangels an Beispielen, die ich finden kann, war ich in der Lage, ein sehr komplexes Objekt via SqlReturnSqlData() zurück zu ziehen, aber ich finde keine Möglichkeit, ein komplexes Objekt in eine gespeicherte Oracle-Prozedur einzufügen. Ich habe noch kein vollständiges Beispiel dafür gefunden, wie jemand benutzerdefinierte komplexe Oracle-Typen einfügt. Via Frühling oder auf andere Weise.

+0

Wir haben uns schließlich für JDBC entschieden. Ich schrieb einen einfachen Generator für Typklassen, die SQLData interaface implementieren, wie in [JDBC Guide] (https://docs.oracle.com/database/121/JJDBC/orootd.htm#JJDBC28461) beschrieben. Wir verwenden dann [OracleCallableStatement] (https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleCallableStatement.html) zusammen mit den generierten Klassen, um die gespeicherte Prozedur aufzurufen. Für die Sammlungsart-Attribute können Sie [OracleArray] (https://docs.oracle.com/database/121/JJDBC/oraarr.htm#i1056527) innerhalb der Java-Klasse verwenden, die SQLData implementiert. –

+0

Herzlichen Glückwunsch. Konnten Sie mit selbst definierten Kindobjekten einfügen? Zum Beispiel mit einem Elternteil Auto und Kind Radio. Ich habe innerhalb der Methode readSQL für die Eltern folgende: setRadio ((Radio) stream.readObject()); Obwohl es zur Laufzeit kompiliert wird, löst es zur Laufzeit eine Casting-Ausnahme aus. xception: oracle.sql.STRUCT kann nicht in com.foo.beans.Radio umgewandelt werden, als ob Radio ein Struct oder STRUCT sein soll. Google-Dokumente sagen, dass Sie dies nicht tun müssen, aber die Dokumente scheinen kein vollständiges Beispiel für eine Eltern-Kind-Beziehung zu bieten. Ich schätze, Sie machen das gleiche in Ihrem ReadSQL ohne Problem. – Jason

+0

Mein Problem war, dass die typeMap keine Werte für die untergeordneten Objekte hatte.Das Spring Data JDBC Extensions-Projekt stellt die typeMap nicht einfach offen und auch keine Beispiele für das Festlegen der Typzuordnung mit untergeordneten Objekten. – Jason

Verwandte Themen