2010-07-26 4 views
2

J'utilise l'interface java.sql.SQLData pour mapper mes objets Java aux types de base de données Oracle.java.sql.SQLData - Problème de mappage d'objet Oracle

Par exemple, j'ai une personne de type d'objet dans Oracle DB défini comme:

CREATE OR REPLACE TYPE PERSON AS OBJECT 
(
     PERSON_ID NUMBER, 
     PERSON_NAME VARCHAR2(100) 
); 

type Java correspondant est:

public class Person implements SQLData { 

private String sql_type = "PERSON"; 
private int personId; 
private String personName; 

public int getPersonId() { 
    return personId; 
} 

public void setPersonId(int personId) { 
    this.personId = personId; 
} 

public String getPersonName() { 
    return personName; 
} 


public void setPersonName(String personName) { 
    this.personName = personName; 
} 

public void readSQL(SQLInput stream, String typeName) throws SQLException 
{ 
    this.sql_type=typeName; 
    this.personId = stream.readLong(); 
    this.personName = stream.readString(); 
} 

public void writeSQL(SQLOutput stream) throws SQLException 
{ 
     stream.writeLong(this.personId); 
     stream.writeString(this.personName); 
} 
} 

Cela fonctionne bien actuellement et renseigne personne Objets du type de base de données.

Maintenant, j'ai un autre type et sa collection correspondante comme suit:

CREATE OR REPLACE TYPE SUBJECT AS OBJECT 
    (
      SUBJECT_ID NUMBER, 
      SUBJECT_NAME VARCHAR2(100) 
    ); 
-- Corresponding List 
CREATE OR REPLACE TYPE SUBJECT_LIST IS TABLE OF SUBJECT; 

Je dois créer une nouvelle entrée en personne de type avec cette collection comme suit:

CREATE OR REPLACE TYPE PERSON AS OBJECT 
(
     PERSON_ID NUMBER, 
     PERSON_NAME VARCHAR2(100), 
     SUBJECT_LIST TYPE SUBJECT_LIST 
); 

Pour faire ce changement je dois changer ma classe de personne de Java. J'ai essayé d'ajouter le paramètre java.sql.Array mais cela ne fonctionne pas.

Pouvez-vous nous aider ici pour mapper le nouveau type d'objet PERSON au type Java?

Merci d'avance.

--Siddharth

Répondre

1

La documentation de SQLInput (lien ci-dessous) a ceci sur la première ligne ...

« Cette interface [ie SQLInput] ... est utilisé par le conducteur dans les coulisses et un programmeur n'invoque jamais directement les méthodes SQLInput. "

Etes-vous sûr de vouloir utiliser SQLInput directement? Y a-t-il un exemple que vous suivez?

Ref: http://java.sun.com/j2se/1.4.2/docs/api/java/sql/SQLInput.html#readObject%28%29

+0

L'exemple ci-dessus est celui que j'utilise actuellement. Je n'utilise pas SQLInput directement. Je suis simplement en train d'implémenter l'interface SQLData et les méthodes readSQL et writeSQL. Les méthodes sont appelées en interne par SQLInput et SQLOutput. Je suis désolé si je n'ai pas décrit correctement l'énoncé du problème. Je dois avoir un type de collection Oracle dans un type d'objet Oracle. Je veux savoir comment je peux créer la classe Java correspondante. Ai-je besoin d'une instance java.sql.Array pour le type Collection? Merci. – Sid

+1

Oui, je pense que vous aurez besoin d'une classe java.sql.Array, bien que nous utilisions oracle.sql.ARRAY car elle implémente déjà beaucoup de méthodes pour nous. – cagcowboy

+0

Donc, devrais-je avoir une instance de java.sql.Array en classe personne, quelque chose comme ceci: private java.sql.Array subjectList; En lectureSql ... this.subjectList = stream.readArray(); En écritureSQL ... stream.writeArray (subjectList); Est-ce que ça signifie? – Sid

0

Hey je ne pas accéder à ce désolé je ne pouvais pas répondre. Ce que j'ai fait était d'avoir un java.sql.Array défini dans ma classe. Ceci correspond au type imbriqué dans la base de données Oracle. Donc, dans ce cas, ma classe de personne aura une variable d'instance:

java.sql.Array subjectList; 

Pour définir la valeur que vous devrez effectuer les opérations suivantes:

Subject[] subjectListArray=null; 
Person p = new Person(); 
p.setSubjectList(new oracle.sql.ARRAY(getOracleArray(typeName, connection, subjectListArray))); 

La méthode getOracleArray sera quelque chose comme ceci:

public static oracle.sql.ArrayDescriptor getOracleArray(final String typeName)throws SQLException 
{ 
    if(typeName==null)return null; 
    final oracle.sql.ArrayDescriptor arrayDescriptor = new oracle.sql.ArrayDescriptor(
      typeName, con); 
    return arrayDescriptor; 
}