2010-07-26 23 views
2

我使用java.sql.SQLData接口將我的java對象映射到Oracle數據庫類型。java.sql.SQLData - Oracle對象映射問題

例如,我已經定義了Oracle數據庫中的對象類型人員爲:

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

對應的Java類型是:

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

目前這工作得很好,並填充人員從數據庫類型的對象。

現在,我有另一種類型,它的相應的集合,如下所示:

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; 

我有如下開創型的人與此集合的新條目:

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

要使這個改變我不得不改變我的java Person類。我嘗試添加java.sql.Array參數,但它不起作用。

你能幫忙在這裏把新的PERSON對象類型映射到Java類型嗎?

在此先感謝。

--Siddharth

回答

1

的SQLInput(下面的鏈接)的文檔中有這在第一行...

「這個接口[即的SQLInput] ...所使用的幕後駕駛員,程序員從不直接調用SQLInput方法。「

你確定你應該直接使用SQLInput嗎?你有沒有一個例子?

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

+0

上面的示例是我現在使用的示例。我沒有直接使用SQLInput。我只是簡單地實現了SQLData接口和readSQL和writeSQL方法。這些方法由SQLInput和SQLOutput在內部調用。 如果我沒有正確描述問題陳述,我很抱歉。我需要在Oracle對象類型中有一個Oracle集合類型。我想知道如何創建相應的Java類。我是否需要Collection類型的java.sql.Array實例? 謝謝。 – Sid 2010-07-28 05:32:09

+1

是的,我認爲你需要一個java.sql.Array類,儘管我們實際上使用了oracle.sql.ARRAY,因爲它已經爲我們實現了很多方法。 – cagcowboy 2010-07-28 06:30:15

+0

所以我應該有一個人類的java.sql.Array實例,如下所示: private java.sql.Array subjectList; 在readSql ... this.subjectList = stream.readArray();在writeSQL中... stream.writeArray(subjectList); 這是你的意思? – Sid 2010-07-28 07:53:29

0

嘿,我沒有訪問此所以抱歉,我不能回答。 我所做的是在我的類中定義了一個java.sql.Array。這映射到Oracle數據庫中的嵌套類型。 所以在這種情況下,我的Person類將有一個實例變量:

java.sql.Array subjectList; 

要設置你需要做以下值:

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

的getOracleArray方法是這樣的:

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