java.sql.SQLData - проблема сопоставления объектов Oracle - PullRequest
2 голосов
/ 26 июля 2010

Я использую интерфейс java.sql.SQLData для сопоставления моих объектов java с типами баз данных Oracle.

Например, у меня есть тип объекта Person в БД 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);
 }
}

В настоящее время он работает нормально и заполняет объекты Person из типа базы данных.

Теперь у меня есть другой тип и соответствующая коллекция следующим образом:

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;

Мне нужно создать новую запись в типе PERSON с этой коллекцией следующим образом:

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

Чтобы внести это изменение, я должен изменить свой класс Person java.Я попытался добавить параметр java.sql.Array, но он не работает.

Не могли бы вы помочь здесь, чтобы сопоставить новый тип объекта ЛИЦО с типом Java?

Заранее спасибо.

- Сиддхарт

Ответы [ 2 ]

1 голос
/ 27 июля 2010

Документация по SQLInput (ссылка ниже) содержит это в первой строке ...

"Этот интерфейс [т.е. SQLInput] ... используется драйвером за кулисами, и программист никогда напрямую не работаетвызывает методы SQLInput. "

Вы уверены, что должны использовать SQLInput напрямую?Есть ли пример, которому вы следуете?

Ссылка: http://java.sun.com/j2se/1.4.2/docs/api/java/sql/SQLInput.html#readObject%28%29

0 голосов
/ 18 августа 2010

Эй, я не получил доступ к этому, извините, я не смог ответить. Что я сделал, так это чтобы в моем классе был определен массив 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...